2026年7月28日 星期二

Blogger 的本篇連結範例 - 1>目錄連結 主題A介紹 2>目標Tag:

 目的:  1>目錄連結 <a href="#Topic-A">主題A介紹</a>  , 由目錄連結至實際內容          
            2>目標Tag: <a  id="Topic-A">  </a> , 目錄的內容

處理說明: 1>目錄連結  <a href="#Topic-A">主題A介紹</a>  
                       --> 有時直接寫 href="#topic-A" 會被瀏覽器誤判為相對於網站根目錄的連結,
                             導致點擊後直接跳轉回網誌首頁或分類頁面。
                       --> 改成永久的連結網址 #Topic-A
                             https://smallsun123.blogspot.com/2026/07/html-scroll-behavior-smooth-b-a.html#Topic-A
                            連結時,會連至永久網址#Topic-A目標 
                      
                  2>目標Tag: <a  id="Topic-A">  </a> , 目錄的內容    

文章目錄


一、主題 A 介紹

這裡是主題 A 的詳細內容...

二、主題 B 介紹

這裡是主題 B 的詳細內容...

▲ 回到文章頂端




連結說明: 使用永久網址#目標


VPN, proxy, FIREWALL 的功用

 VPN, PROXY, FIREWALL 的功用

PS: firewall 的設定範例 - Windows PowerShell

一、三者在網路中的位置

                    Internet(網際網路)
                           │
            ┌──────────────┼──────────────┐
            │              │              │
         各種網站        雲端服務       郵件伺服器
                           ▲
                           │
                    Proxy Server
                           ▲
                           │
                     Firewall
                           ▲
                           │
                        VPN Tunnel
                     (加密通道)
                           ▲
                           │
                  你的電腦/手機

二、各自的工作

① Firewall(防火牆)— 門衛

工作內容:

  • 檢查每個封包
  • 決定允許或拒絕
  • 阻擋駭客攻擊
  • 控制哪些程式可以連網

例如:

外部封包
    │
    ▼
 Firewall
 ┌─────────┐
 │允許 ✔   │
 │拒絕 ✖   │
 └─────────┘

就像公司大樓警衛:

「沒有證件,不准進。」


② Proxy Server(代理伺服器)— 代辦人

它不讓你直接跟網站接觸。

你
 │
 ▼
Proxy
 │
 ▼
Google

Google 看到的是:

Proxy 的 IP

而不是你的 IP。

Proxy 可以:

  • 隱藏 IP
  • 快取資料
  • 過濾網站
  • 記錄上網行為

③ VPN(虛擬私人網路)— 加密隧道

VPN 不只是代理,而是把整條連線加密。

你
 │
 │ 加密
 ▼
═══════════════
 VPN Tunnel
═══════════════
 │
 ▼
VPN Server
 │
 ▼
Internet

即使有人攔截封包,也只能看到加密後的內容。

三、生活中的比喻

假設你要寄一封信。

沒有任何保護

你 ─────────► 公司

任何人都可能看到:

  • 寄件人
  • 收件人
  • 信件內容(如果沒有加密)

使用 Firewall

你
 │
警衛
 │
公司

警衛只負責:

「檢查能不能出去。」

不會替你寄信。


使用 Proxy

你
 │
朋友代寄
 │
公司

公司只知道:

是朋友寄來的。

不知道真正寄件人。



四、三者比較

功能FirewallProxyVPN
阻擋攻擊
隱藏 IP
加密資料通常沒有
提高隱私
控制網站❌(主要功能不是過濾)
全系統保護通常只有特定程式

五、在公司網路中的實際架構

很多企業會同時使用這三種技術:

員工電腦
     │
     ▼
 Firewall
(阻擋攻擊)
     │
     ▼
 Proxy
(網站過濾、快取、記錄)
     │
     ▼
 Internet

如果員工在家工作,通常還會加入 VPN:

家中電腦
     │
     ▼
 VPN(加密)
══════════════════════
     │
公司 VPN Server
     │
 Firewall
     │
 Proxy
     │
 Internet

這樣即使在外面使用公共 Wi-Fi,也能安全地連回公司內部網路。

一句話總結:

  • Firewall:決定「能不能通過」。
  • Proxy:代替你「去連線」。
  • VPN:建立一條「安全且加密的專用通道」。

三者各有不同角色,也常常一起使用,形成完整的企業網路安全架構。



PS  : firewall 的設定範例 - Windows PowerShell
======================== 
 PS:Firewall 設定範例 - Windows PowerShell 
 New-NetFirewallRule ... 
========================



WIN_AMM_V502- 需求物料自動上載 - FTP Server 於Local執行正常,但於排程主機執行 , 有問題 - 194.1.6.80

 目的: WIN_AMM_V502- 需求物料自動上載 
            - FTP Server 於Local執行正常,但於排程主機執行 , 有問題 -  FTP IP:194.1.6.80

處理說明: 1>同一支程式, 於不同的電腦執行結果不同 
                       --> 因不同電腦的設定不同
                       --> Ex1: 日期格式設定不同
                                    我的電腦日期格式: YYYY/MM/DD
                                    主機電腦日期格式: YYYY/MM/DD  上午/下午 HH:MM
                                     --> insert AMM_CHKCHG_ASN 
                                           (INS_DT,..)  
                                           VALUES 
                                          ('YYYY/MM/DD 上午 HH:MM',.. );
                                     --> SQL 會  Error 
                       -->  Ex2: proxy 設定不同  , FTP Server 主機的IP: 194.1.6.80
                              我的電腦. 194.1.6.80  列為內網,不會透過 proxy 
                              主機的電腦. 194.1.6.80  列為外網,會透過 proxy , FTP 連線會失敗,不會成功

                      -->  Ex3: 將排程程式的主機,更換 IP 由 194.1.6.251 改到 194.1.6.249
                                     導致 FTP 執行失敗
                             主機1: 192.1.6.251   將  192.1.6.80 視為內網, FTP連線 OK
                             主機2: 192.1.6.249   將  192.1.6.80 視為外網,必需透過 proxy,FTP連線 失敗,
                                                                --> 因 proxy主機認證失敗(沒有AIDC_ID/PASS)













                                       
             

2026年7月22日 星期三

V1060304 – 定更定檢拆挪管制 – Grid 只允許挑選一筆資料(不可多選)

 目的: V1060304 – 定更定檢拆挪管制 – Grid 只允許挑選一筆資料(不可多選)

處理說明:  1>
                       var sub_Grid1 = Ext.create('TMGrid', {
                             grid_id: 'sub_Grid1',
                                  :                   
                           selModel: {
                                           selType: 'rowmodel',   // 預設就是 rowmodel
                                           mode: 'SINGLE'         // 關鍵:只允許單選
                          },

                        });  // end of sub_Grid1


1>*.js

  var sub_Grid1 = Ext.create('TMGrid', {
            grid_id: 'sub_Grid1',
            columns: sub_Columns1,
            //autoScroll: true,
            flex: 1,
            store: Ext.create('gridstore', { model: sub_model1 }),
            plugins: [                
                Ext.create('Ext.grid.plugin.CellEditing', {   // 不會出現[Update][Cancel]鈕, 直接編輯 
                    clicksToEdit: 1,                           // 按一下進行編輯,預設為按兩下
                    clicksToMoveEditor: 1,     //在編輯模式下切換編輯另一行的行為
                                                               //1表示點選一就切換;   2表示點2下才切換。
                })],
            selModel: {
                selType: 'rowmodel',   // 預設就是 rowmodel
                mode: 'SINGLE'         // 關鍵:只允許單選
            },
        });  // end of sub_Grid1


2026年7月21日 星期二

V1060302 - change event - blur event - 檢核管制 - 輸入資料是否已完成

目的: V1060302 - change event - blur event 
– change event – 判斷是否有查詢資料 – 若有則顯示查詢資料,若無 à 則不顯示錯誤訊息
– blur event – 判斷是否有查詢資料 – 若有則顯示查詢資料,若無 à 則顯示錯誤訊息

處理說明: 1>change event 
                      判斷是否有對應資料 若有則顯示對應資料,若無 à 則不顯示錯誤訊息
                               2>blur    event
                      判斷是否有對應資料 若有則顯示對應資料,若無 à 則顯示錯誤訊息


1>*.js

Ext.getCmp("ITEM").on('change', function (me, newValue, oldValue, eOpts) {    
        var Tmp_PROJID = Ext.getCmp("PROJID").getValue();
        var Tmp_TYPE = Ext.getCmp("TYPE").getValue();
        var Tmp_ITEM = Ext.getCmp("ITEM").getValue();
        // change event , 不顯示 AMM_CHKCHG 不存在訊息
        if ((!checkisnull(Tmp_PROJID)) && (!checkisnull(Tmp_TYPE)) && (!checkisnull(Tmp_ITEM))) {
            Show_AMM_CHKCHG_Data(Tmp_PROJID, Tmp_TYPE, Tmp_ITEM,"false");
        }            
    });

Ext.getCmp("ITEM").on('blur', function (me, eOpts) {
        var Tmp_PROJID = Ext.getCmp("PROJID").getValue();
        var Tmp_TYPE = Ext.getCmp("TYPE").getValue();
        var Tmp_ITEM = Ext.getCmp("ITEM").getValue();
        // blur 時,才顯示  AMM_CHKCHG 不存在訊息
        if ((!checkisnull(Tmp_PROJID)) && (!checkisnull(Tmp_TYPE)) && (!checkisnull(Tmp_ITEM))) {
            Show_AMM_CHKCHG_Data(Tmp_PROJID, Tmp_TYPE, Tmp_ITEM, "true");
        }
});


2>*.cs
 [HttpPost]
        public dynamic get_AMM_CHKCHG()
        {
            //取得參數值
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;

            string Tmp_PROJID = nvc["PROJID"];
            string Tmp_TYPE = nvc["TYPE"];
            string Tmp_ITEM = nvc["ITEM"];
            string  Tmp_is_Show = nvc["is_Show"];  //true : 顯示訊息, false : 不顯示訊息

            int Tmp_cnt;
            string Tmp_RtnMsg = "";
            string Tmp_Sql = "";
            string Tmp_Str = "";

            string n = funId + "_get_AMM_CHKCHG";
            HttpCookie MyCookie;
            DataTable Tmp_dt1 = new DataTable();
            string Tmp_dt2JSON;
            string Tmp_TMBASE1, Tmp_TMUNIT1, Tmp_TMBASE2, Tmp_TMUNIT2;
            string Tmp_PTMUNIT1, Tmp_PTMUNIT2;
            string Tmp_TMBASE1_, Tmp_TMUNIT1_, Tmp_TMBASE2_, Tmp_TMUNIT2_;
            string Tmp_PTMUNIT1_, Tmp_PTMUNIT2_;
            try
            {
                Tmp_Sql = "  SELECT   PROJID,TYPE,ITEM,"
                                                  + " WUC,SITEM,CHKCHG_TEXT,CHKCHG_NM,CHKCHG_TM,PN,IS_MULTI,"
                                                  + " TMBASE1,TMFEQ1,TMUNIT1,TMBASE2,TMFEQ2,TMUNIT2, "
                                                  + " PTMVAL1,PTMUNIT1,PTMVAL2,PTMUNIT2,"
                                                  + " HAS_FCHK,FCHK_VAL,ENG_LR,IS_SER"
                                + "   FROM    AMM_CHKCHG   "
                                + "  WHERE   PROJID=" + myfunc.AA(Tmp_PROJID)
                                + "   AND       TYPE=" + myfunc.AA(Tmp_TYPE)
                                + "   AND       ITEM=" + myfunc.AA(Tmp_ITEM)
                                ;
                Tmp_dt1 = myfunc.SqlOpen(Tmp_dt1, Tmp_Sql);
                Tmp_cnt = Tmp_dt1.Rows.Count;
                //Tmp_Str = myfunc.SqlValue(Tmp_Sql);
                if (Tmp_cnt==0)
                {
                    //若要顯示訊息(blur event),則傳回錯誤訊息
                    if (Tmp_is_Show=="true")
                       Tmp_RtnMsg = "錯誤: 專案別(" + Tmp_PROJID + ")"
                                               +"分類(" + Tmp_TYPE + ")"
                                               +"ITEM(" + Tmp_ITEM + ")<br>"
                                             + "不存在[專案定更定檢資料檔(AMM_CHKCHG)]<br>"
                                             + "敬請檢核 !!<br>";
                }
                else
                {
                    /* 傳回如下欄位值, 以  ; 分隔欄位值
                     * PROJID,TYPE,ITEM,
                         WUC,SITEM,CHKCHG_TEXT,CHKCHG_NM,CHKCHG_TM,PN,IS_MULTI,
                          TMBASE1,TMFEQ1,TMUNIT1,TMBASE2,TMFEQ2,TMUNIT2,
                          PTMVAL1,PTMUNIT1,PTMVAL2,PTMUNIT2,
                          HAS_FCHK,FCHK_VAL,ENG_LR
                     */                    
                    Tmp_dt1.Columns.Add("TMBASE1_", typeof(object));
                    Tmp_dt1.Columns.Add("TMUNIT1_", typeof(object));
                    Tmp_dt1.Columns.Add("TMBASE2_", typeof(object));
                    Tmp_dt1.Columns.Add("TMUNIT2_", typeof(object));
                    Tmp_dt1.Columns.Add("PTMUNIT1_", typeof(object));
                    Tmp_dt1.Columns.Add("PTMUNIT2_", typeof(object));

                    for (var i = 0; i < Tmp_cnt; i++)
                    {
                        DataRow dr = Tmp_dt1.Rows[i];
                        Tmp_TMBASE1 = dr["TMBASE1"].ToString();
                        Tmp_Sql = " SELECT      DESCPT "
                                    + " FROM       KEYCODE  "
                                    + " WHERE   TBL_NAME = 'AMM_CHKCHG'  "
                                    + " AND         KEY_NAME = 'TMBASE1'   "
                                    + " AND         KEY_CODE=" + myfunc.AA(Tmp_TMBASE1);
                        Tmp_TMBASE1_ = Tmp_TMBASE1 + ":" + myfunc.SqlValue(Tmp_Sql);
                        //屆期單位1
                        Tmp_TMUNIT1 = dr["TMUNIT1"].ToString();
                        Tmp_Sql = " SELECT      DESCPT "
                                        + " FROM       KEYCODE  "
                                        + " WHERE   TBL_NAME = 'AMM_CHKCHG'  "
       

2026年7月9日 星期四

V1060302B – 匯入 –C# 主函式呼叫子函式 – 子函式可以供用主函式的現有變數

 目的: V1060302B – 匯入 –C# 主函式呼叫子函式 子函式可以供用主函式的現有變數

處理說明: 1> 宣告子函式    
                                        void CHECK_TMVAL()
                                              {
                                                       共用主函式的變數
                                                }
                                 2>在主函式中呼叫子函式
                                       [HttpPost]
        public void XLS2XLS()
        {
            HttpContext c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string FName = nvc["FName"]; 
             string Tmp_L_FLYHR; 
               try
               {

                            }                               :

                           CHECK_TMVAL();   

                                            void CHECK_TMVAL()
                                              {
                                                       //共用主函式的變數
                                                       Tmp_L_FLYHR=105;
                                                }
                                        }// end of XLS2XLS


2026年7月8日 星期三

由 GitLab 下載 TLSWEB_PM專案 master Source 至 Local目錄 -II

 目的: 由 GitLab 下載 TLSWEB_PM專案 master  Source 至 Local目錄

處理說明: 1> 至  GitLab 網站(https://gitlab)
                  2>選擇 Member 頁(各專案存放庫) - TLSWEB_PM
                  3>複製 PM專案.Code 在 Gitlab 的位置 , 以便至 Visual Studio 下載存放庫   
                  4> 在 Visual Studio 環境,由 Gitlab 的位置安裝  PM專案 Source
                  5>在 C# 7.3 中無法使用 'using 宣告' 功能。請使用C#語言版本 8.0 。
                       於 TLSWEB_PM.csproj 中, 文字檔案加入
 <PropertyGroup>
 <LangVersion>8.0</LangVersion>
 </PropertyGroup>
                   6>web.config 
                       <!--server端帳密,發行時請取消註解-->
                       <!--<identity impersonate="true" userName="webadmin" password="Ai@" />-->
                   7>由 gitlab 的位置安裝 PM專案, 安裝後多一  package 目錄 
                        若由 *.zip 安裝,則無 package 目錄 
                         
1> 至  GitLab 網站(https://gitlab)


2>選擇 [Member]頁 - [TLSWEB_PM] 


3>複製 Gitlab 的專案Source 位置


4>Visual Studio環境,取得 Gitlab 的程式碼




5>由 gitlab 的位置安裝 PM專案, 安裝後多一  package 目錄