2017年2月7日 星期二

[IT人應該看] 離職前,一堂價值非凡的課 -- 莫忘初衷

一位曾經年薪數百萬的老前輩,在我離職前,教我的一堂課 -- 莫忘初衷。
希望對您也有幫助。

之前,我認識一位高階主管為了自己的理想,去當 SOHO族(請看:自己養不到最優秀的人才 )
這位 K先生今天剛好來跟我們開會,我有榮幸在會議結束後,跟他談了一陣子。

談到我自己的規劃、在公司遇見的困境、下一步路該怎麼走....等等
他一聽到我遇見這些困難,給了我不少建議。

希望我聽到的這些經驗談,也能分享給各位。(寫得有點亂,請見諒~)
.................................................................................................................................................................
1. 知道自己要什麼
在職場上奮鬥,不管是頭銜?錢?成就感?...等等
人生總要有一個目標在,不然遇見困難的時候,就會挺不住。
        如果為了錢,只要薪資過得去,再大的苦都會忍住。
        如果為了成就感,只要做得開心,錢少一點也甘之如飴。
有了明確的目標,才能走得長久。
不要考慮太多、想得太遠,先想想自己的初衷。 
來職場工作的「初衷」,會是自己唯一一個、最明確的目標

2.  提了辭呈,該走?還是該被慰留?
這個問題根本不存在。關鍵重點在於「這次提辭呈,能不能解決眼下的問題?」
如果今天為了「工作內容」不如預期而離開,只要下一個工作符合期望就好了。不要在乎下一個工作錢多錢少,因為「工作內容」才是自己在乎的,不是嗎?
如果反悔了,願意留下來(或是老闆慰留),也不要擔心同事講閒話。要注意的是「逼你離開的原因,你的直屬主管是否幫你處理掉了?」。如果不能徹底解決,問題遲早會再來。所謂「躲得了今天,躲不了一輩子」,如果是這樣,留下來也沒意思。
不論如何,不要做了決定又後悔。     因為「後悔」是人生最沒有價值的產物。

3. 寫程式,該寫多久?一直寫程式,薪資總有上限
不是每個人都討厭寫程式的,有些人就是喜歡這種工作。
        對他們來說,寫程式的「成就感」,就是他們工作的初衷。也是他們快樂的來源。
如果確認自己的目標,把寫程式當成一段經歷、只是一段歷練。
        那就要捍衛自己的目標。不是必要、不是最後關頭,就不要繼續寫下去了。
因為一沾到程式開發,日後的維護與DeBug絕對脫不了身。
東西是你寫的,你一定最熟悉,別人接不下來,會讓你逃不掉。
但也不是說寫程式一定都不好,以 SOHO族來說,技術能自己處理掉,才能賺到錢。
樣樣都要外包,認為自己開公司當老闆(當SOHO)就不能寫程式.....遲早會餓死。
也只有技術傍身,這樣的人才能創業。

4. 離職的時候,該講真話?還是講謊話?
跟自己的直屬主管,"或許" 可以講真話。  但也要看自己的份量、跟主管的交情來決定。
如果是更高層的主管,那就要「包裝一下」了。
畢竟,我們不知道講了真話以後,會給留下來的人帶來什麼困擾?
        你的好心建議,可能會被聽成「抱怨」。
        你的無心抱怨,可能會被聽成「對某人的攻擊」。
不過,一般來說,跟自己關係不深的高階主管,只要跟他們說有更好的人生規劃、有更好的地方可去。他們往往不會刁難你。
職場是一個小圈圈,不管離開以後,是要換公司或是自己創業,「人脈不能斷」,所以「話不要講得太白」。
總有一天會再合作與見面。 
再合作的時候,那時候沒有恩怨,大家都是為了同一個目標在努力。

5. 錢與成就感,誰比較重要?
這個問題沒有答案,答案就在於「自己的價值觀」。
現在很多人回鄉當自耕農,搞無毒或是有機農業。自己種、自己包裝、自己賣......,或許錢不多,但賺到成就感,賺到彈性的生活時間。
當一個SOHO族也一樣,絕對比不上我當年在A公司的年薪。
SOHO一年能賺一百萬,我就覺得已經是中等程度了。
反而是當了SOHO族以後,我才會去省思我自己要什麼?
生活上,真的有必要花這麼多錢(支出)嗎?

能跟夥伴(其他SOHO族)一起完成工作,追求自己的成就感。
有自己彈性的時間去過自己的生活。跟家人的互動更緊密了。
上述幾點都比"錢" 更有價值。
這事情沒有答案,也不須比較,就看自己的「價值觀」。
只要能掌握自己的價值觀,找到進入職場的初衷,那麼就能過關斬將,關關難過關關過。
因為自己心一旦定了下來,外面的風雨都是一陣子的短暫挫折罷了。

6. 自己接案寫程式,遇見難纏客戶,該不該停損?
作軟體,其實是服務業!    更正確地說,是「社會公益」。
如果每個人都把客戶拋棄了,那客戶怎麼辦?  你也有軟體是外包給人做的,如果對方不理你了,你怎麼想?
你會遇見結不了案、或是難纏客戶,絕對跟我們當初規劃有關。
當初沒規劃好,才會出現事後責任難以離清的問題。
要作軟體做得長久,一定要以「穩定」為優先。
用笨方法也無所謂。只有「穩定」,才能賺錢。
但目前的情況是「為了大家都有飯吃」,所以把解決方案不斷擴大。拉了好多人進來一起作.....
初期看到大家都有分到一塊大餅,但事後很難釐清就結不了案。
以c++為例,能用 Array去作,何必要寫pointer? 
工程師不要只想炫耀自己的技術,程式必須要讓別人能接手,才有真價值。

7. 別忘了繼續前進。
就算是當一個 SOHO族,也要幫自己定目標。
每一年要有什麼突破?營業額?或是技術突破都可以?
別以為自己當老闆,就不用寫履歷了。  人生,時時刻刻都在幫自己寫履歷。
在蓋棺論定以前,都不要錯過自己的人生。
我目前合作的一位廠商,原本是台大醫院的名醫。他大可不必出來創業,尤其是跨領域,改作資訊軟體業。
但他說:「我給自己一個人生規劃,四十歲創業,在十年內,我允許自己失敗三次。」
因為失敗不可怕,這些經驗才能確保自己以後「有機會」成功。
成功是賺大錢嗎?  也未必。
能完成自己的一個夢,讓自己工作得快樂、有成就感,那是我工作的初衷。
對我來說,這才是成功。

很多人認為在大公司裡面最穩定,但上面卡位的人也最多。呆了一輩子,獲得什麼?
只要符合自己價值觀,那就是好的。
離開大公司的羽翼,是多麼冒險的行為。  但是,冒險才有機會,有機會才能成功。
北投的A公司不也是從汐止A公司出來的人馬嗎?  如果沒有當初的冒險,他們今日會這麼棒嗎?
要留下來、或是要走,都是機會。  只要你不後悔,就是好決定。

8.  家人最重要
我們出來工作,難道不是希望自己的家庭、父母能過得好?
要多賺錢?還是要顧生活品質?................  一定要跟家人好好討論過。
千萬不要一意孤行。
沒有家人支持的職場生涯,絕對撐不久。
.................................................................................................................................................................


聽完 K先生給我上的一堂課,我的心是滿滿的
我何其有幸,能遇見這樣一位資深的老前輩。
他願意分享他人生的經驗,解我目前的苦。

一位 SOHO族,時間就是金錢。 
他願意花兩小時來跟我談「我目前工作的困境」,多麼地讓人感恩。
我的紀錄可能不太齊全,沒有寫得很詳細。
希望他的職場經驗,也能分享給大家。

2017年2月6日 星期一

[FAQ] ADO.NET 參數寫法 Parameter #2(避免SQL Injection資料隱碼攻擊) SqlParameterCollection

上一篇文章 http://mis2000lab.blogspot.tw/2017/02/faq-adonet-parametersql-injection.html

網路上找到的其他寫法,為自己做一個筆記

        SqlConnection Conn = new SqlConnection("DB連結字串");
        SqlDataReader dr = null;
        SqlCommand cmd = new SqlCommand("select * from 資料表test where id = @id", Conn);
        
            //== 參數!! ============================(start)
            cmd.Parameters.Clear();
            List paralist = new List();
            paralist.Add(new SqlParameter("@id", "輸入值")));
            //--第一種寫法------------------------------------------------
            //paralist.Add(new SqlParameter("@p1", value1));    //如果要加入多個參數,怎麼辦??
            //paralist.Add(new SqlParameter("@p2", value2));
            cmd.Parameters.AddRange(paralist.ToArray());   
            // 把「陣列」值,批次加入參數裡面
            ////--第二種寫法------------------------------------------------
            //cmd.Parameters.AddRange(new SqlParameter[]
            //{
            //    new SqlParameter("@p1", value1),
            //    new SqlParameter("@p2", value2)
            //});
            ////--第三種寫法------------------------------------------------
            //SqlParameterCollection paraCollection = cmd.Parameters;
            //foreach (SqlParameter para in paralist)  
            //{
            //    paraCollection.Add(para);
            //}    
       
            ////--第四種寫法------------------------------------------------
            //**** 有時method裡,引數數量並不是固定的,就可以用params來宣告 ****
            //== 參數!! ============================(end)
        try   {  
            Conn.Open();   //== 第一,連結資料庫。
            dr = cmd.ExecuteReader();    //== 第二,執行SQL指令,取出資料
            GridView1.DataSource = dr;   //==第三,自由發揮,把執行後的結果呈現到畫面上。
            GridView1.DataBind();    //--資料繫結
        }
        catch (Exception ex)  {  
            //---- 如果程式有錯誤或是例外狀況,將執行這一段
        }
        finally  {
            // == 第四,釋放資源、關閉資料庫的連結。
            if (dr != null)  {
                cmd.Cancel();
                dr.Close();
            }
            if (Conn.State == ConnectionState.Open)  {
                Conn.Close();
                Conn.Dispose(); //---- 一開始宣告有用到 New的,最後必須以 .Dispose()結束
            }
        }

[FAQ] ADO.NET 參數寫法 Parameter(避免SQL Injection資料隱碼攻擊)

Conn代表資料庫連結  SqlConnection


...................................................................................................................................................
DataReader (SqlCommand)
            String SQLString = "Select * From test Where id = @id ";    // 注意到沒?連「單引號」都不可以出現
            SqlCommand cmd = new SqlCommand(SQLString, Conn);
            cmd.Parameters.Add("@id", SqlDbType.Int, 4);
            cmd.Parameters["@id"].Value =TextBox1.Text;

            //簡易寫法。 cmd.Parameters.AddWithValue("@參數名稱", 輸入的數值);
            //上面兩段參數,可以寫成  cmd.Parameters.AddWithValue("@id", TextBox1.Text);

....................................................................................................................................................
DataSet / DataTable (SqlDataAdapter)
// 注意!!資料隱碼攻擊(Sql Injection),請使用參數的寫法。
            String SQLString = "Select * From test Where id = @id ";  // 注意到沒?連「單引號」都不可以出現
            SqlDataAdapter myAdapter = new SqlDataAdapter(SQLString, Conn);
            //== 參數必須在執行SQL指令的時候,寫在下方等待呼叫。不然程式會出錯。
                ////舊的寫法:
                //myAdapter.SelectCommand.Parameters.Add("@id", SqlDbType.Int, 4);
                //myAdapter.SelectCommand.Parameters["@id"].Value = TextBox1.Text;
                
                //新的寫法:合併在一起寫
                myAdapter.SelectCommand.Parameters.AddWithValue("@id", TextBox1.Text);

完整的範例可以參閱我的書本上集

.AddWithValue()方法,請看 msdn網站 。
他的範例就介紹了我上面的兩種作法,請擇一使用

如果您使用 OleDb或是 Odbc,請把參數寫成「?」符號 (後面不可以帶上參數名稱喔!只有一個 ?符號而已)

下一篇文章:

[FAQ] ADO.NET 參數寫法 Parameter #2 -- SqlParameterCollection


FAQ -- 資料隱碼攻擊(SQL Injection)



我上課會解說,但幾個攻擊方式不便公開,
以免有心人拿到(學到)去測試「別人網站」

這本書有蒐集不少範例,推薦給您  
Beginning ASP.NET Security (0470743654) cover image

Beginning ASP.NET Security

Barry Dorrans
ISBN: 978-0-470-74365-2
Paperback
436 pages
March 2010

....................................................................................................................................................
另外,關於XSS攻擊(跨網站腳本攻擊,Cross-Sitws Script),可以看這本書

 XSS 網站安全技術與實務 : 防護解密剖析大進擊 (博碩) & Microsoft AntiXSS


防範 XSS的話,ASP.NET有提供 AntiXSS
檢查使用者輸入內容 - 以 AntiXss 做編碼
MICROSOFT ANTIXSS LIBRARY 3.1 UPGRADE 4.0  (KingKong Bruce)
msdn官方網站 -- System.Web.Security.AntiXss 命名空間

相關文章:

Microsoft Anti-XSS (Anti-Cross Site Scripting Library) 避免XSS攻擊


ASP.NET WebForm & MongoDB

1. MongoDB是 NoSQL,意思是 Not Only SQL。
2. 簡單的安裝步驟
3. ASP.NET & MongoDB

最近在朋友介紹下,也跟著看AngularJS

買了一本三合一的書,Node.JS+MongoDB+AngularJS
http://www.pearsoned.co.uk/bookshop/detail.asp?item=100000000577793
當然,我看簡體中文版的 http://product.dangdang.com/1230824864.html
====== 簡介  ===================================
MongoDB(我在想,這英文是指蒙古嗎?Mongol?)
可以參閱維基百科,說明得很清楚。https://zh.wikipedia.org/wiki/MongoDB
MongoDB是 NoSQL,意思是 Not Only SQL。除了有Windows版本,也提供了C#與.NET的Driver讓我們連結。
是一種「文件」導向的資料庫。他沒有Schema,存放的格式為BSON。
BSON(Binary JSON),其實就是JSON的輕量化版本。說真的,我初步看起來覺得是一樣的,不過其中有些差異。
BSON原廠網站(http://bsonspec.org/)的說明如下:
BSON [bee · sahn], short for Binary JSON, is a binary-encoded serialization of JSON-like documents. Like JSON, BSON supports the embedding of documents and arrays within other documents and arrays. BSON also contains extensions that allow representation of data types that are not part of the JSON spec. For example, BSON has a Date type and a BinData type.
BSON can be compared to binary interchange formats, like Protocol Buffers. BSON is more "schemaless" than Protocol Buffers, which can give it an advantage in flexibility but also a slight disadvantage in space efficiency (BSON has overhead for field names within the serialized data).
不瞞您說,MongoDB原廠網站就寫得很清楚了,比書本還清楚
關於JSON(如果您想瞭解JSON與BSON)可以參閱我以前整理的文章。
https://www.dotblogs.com.tw/mis2000lab/2013/10/24/json_jquery


====== MongoDB 簡單的安裝   ===================================
下載 MongoDB以後,簡單的安裝步驟如下。
如果您不想下載、不想安裝在本機上,可參考底下的「附錄一」這篇文章(有雲端的免費資源可用)
以下步驟,可參考底下的「附錄二」這篇文章

第一,安裝完成後,請先建立一個目錄給MongoDB使用,我依循預設值,建立了 c:\data\db\
第二,執行 mongod指令,就會建構起來。

第三,建立一個 test資料庫,請輸入指令 mongo \localhost\test
而且最後加入兩筆紀錄(MongoDB稱為 Document)


====== MongoDB & ASP.NET  ===================================
您可以先在Visual Studio的「NuGet」裡面搜尋「MongoDB」關鍵字並且安裝相關套件 -- MongoDB.Driver
這樣做最便利。
也可以在 MongoDB原廠網站下載C# Driver,然後自己 "加入參考"
簡單的示範如下:
using MongoDB.Driver;
using MongoDB.Bson;
        var Conn = new MongoClient("mongodb://host:27017/test");
        var db = Conn.GetDatabase("test");
        var collection = db.GetCollection("test");    // 資料表
        var document = collection.Find(new BsonDocument()).FirstOrDefault();
        Response.Write(document.ToString());   // document就是一筆記錄
       
       
相關文章:
    附錄一    MongoDB Tutorial(1)雲端時代的 MongoDB 環境建置
    http://www.codedata.com.tw/database/mongodb-tutorial-1-setting-up-cloud-env/

          這篇文章裡面,針對MongoDB與傳統DB的對照表,寫得很讚!
    附錄二    Connecting MongoDB with ASP.NET
    http://www.codeproject.com/Articles/656093/Connecting-MongoDB-with-ASP-NET

          這篇文章很棒,但後續的ASP.NET程式因為版本更替,已經無法套用。
          建議直接參考原廠文件較好 http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/

    趨勢科技導入MongoDB 追蹤管理全球10萬個行動裝置
    http://www.ithome.com.tw/tech/87418

另一個有趣的問題:
    Youtube影片 -- How to connect to Microsoft SQL Server database using NodeJs
    https://www.youtube.com/watch?v=MLcXfRH1YzE