Wednesday, November 21, 2018

[C#] Swashbuckle WebAPI HTTPS BaseUrl and Bearer token

因為Swashbuckle作者跑去專心做Swashbuckle.AspNetCore了,所以在使用上遇到一些問題時要自己想辦法解,這邊紀錄一下遇到的兩個問題。


HTTPS BaseUrl Issue

因為我有用 cloudflare 的 Flexible SSL,在production環境上外面看起來是HTTPS,但Server上走的仍然是HTTP,這時候swagger的 BaseUrl 會因為 Uri Scheme 出問題,所以要來想辦法解,整理需求後,我只需要本機測試(localhost)走HTTP,其他就走HTTPS,按照這個需求來做的解法如下。

//SwaggerConfig.cs
config.EnableSwagger(c =>
{
    c.RootUrl(ResolveBasePath);
    c.Schemes(new[] { "http", "https" });
}

internal static string ResolveBasePath(HttpRequestMessage message)
{
    //fix for Cloudflare Flexible SSL and localhost test
    var scheme = message.RequestUri.Host.IndexOf("localhost") > -1 ? "http://" : "https://";
    return scheme + message.RequestUri.Authority;
}

這樣就可以兼顧正式機與本機開發都正常使用,如果透過proxy那要再另外解,我這邊就先略過。

Wednesday, October 24, 2018

[ASP.NET MVC] Remove response header | 移除回應標頭


有時候做網站會想把一些header移除,但是久久做一次都要查一下,所以決定寫這篇之後就不用查了。



目前使用的版本是MVC 5.2.4,跑在IIS 10上,上面可以看到沒設定前,response有三個header是一般來說大家會去移除的,分別是server, x-aspnet-version, x-powered-by,下面分別說一下移除方法,我是找不用動到IIS設定,改動最小的做法,但是需要改到web.config,如果權限不能碰到web.config的話要另外想辦法。

Server

移除Server header需要在 Global.asax.cs 裡面加上這段
        protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
        {
            var app = sender as HttpApplication;
            // remove Server header
            app?.Context.Response.Headers.Remove("Server");
        }
不過這樣子只能移除由程式產生檔案的header,對於靜態檔像是.js .css之類的還是會有header,所以還有另外一個地方要修改;在web.config內的system.webServer元素內,將 modules 加入runAllManagedModulesForAllRequests="true"這個設定,像是下面這樣,就可以把靜態檔的header也移掉。


X-AspNet-Version

要移除這個header要修改web.config,在httpRuntime element內加入enableVersionHeader="false",像我的情況就是下面這樣。



X-Powered-By

這header也要在web.config內修改,在system.webServer元素內加入customHeaders,像是下面這樣





最後再看看結果,上面三個header都移除了,可賀可喜,收工。

Tuesday, October 23, 2018

[C#] XML to Object / Generic | XML泛型轉換

Recently, I have to some things related to XML in the work, so I prepared some tools and wrote the method of converting XML to Object, but it is not very beautiful on using.
最近工作上需要做一些跟XML有關的東西,所以先準備些工具,一開始也沒多想就寫了將XML轉成Object的方法,但是使用上有點不漂亮。
static object XmlToObj(XDocument xml, Type objType)
{
    object obj;
    try
    {
        XmlSerializer serializer = new XmlSerializer(objType);
        using (TextReader reader = new StringReader(xml.ToString()))
        {
            obj = serializer.Deserialize(reader);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        return null;
    }
    return obj;
}

Using above XmlToObj, it need to cast it first, the code isn't feel so beauty, so I decide rewrite it to generic method.
使用上面的XmlToObj,會需要做轉型才能使用,code感覺不是很美,所以我決定改寫成泛型的方式。
var result = (PurchaseOrder)XmlToObj(doc, typeof(PurchaseOrder));

Wednesday, June 6, 2018

[C#] Implement Pivot with LINQ | 用 LINQ 實現 Pivot

Here we will demo how to using LINQ implement Pivot feature in two ways, at first we need a demo data source.
這邊我們要展示如何使用LINQ實作Pivot功能,共兩個方式,首先我們需要一個示範的資料來源。

pivot_1
That table with two brand(both having two products)in four months will be use in this demo.
這個有兩個品牌(各有兩個產品)在四個月間的表格將會用在這次demo.

Friday, May 25, 2018

政府錯了,機車才是最乾淨的交通工具

[At first,這邊所謂的交通工具,定義為使用燃油(汽油、柴油)的交通工具。]

五月中時,新任總統府祕書長陳菊表示「新北市機車全台最多 汙染超過深澳電廠」,言下之意就是機車很汙染就對了。

政府每次都拿最弱勢的機車開刀早就不意外了,之前當上行政院長的賴清德「抗空汙」也是先砍機車再說,反正政府與論就是讓民眾覺得機車汙染很大,但事實真的是這樣嗎 ?

錯,在汽油車、柴油車、機車三者中,機車是最乾淨的。

平均單輛總排放來看,機車不到汽油車的二分之一,更不到柴油車的十六分之一,若只看PM2.5排放,單輛汽油車平均是機車的三倍,柴油車則是將近機車的七十八倍


Tuesday, April 3, 2018

[C#] An fast way to implement Active Directory login to ASP.NET MVC

Although OWIN have a package "Microsoft.Owin.Security.ActiveDirectory" seems can support AD login, but it looks like made for ADFS, and leak document on MSDN so I dunno how to use it on basic AD login, so I decide find other way to implement AD login to MVC.

After long long time search, this post "OWIN with LDAP Authentication" help me a lot, my solution basic on it and add some other feature.

Monday, March 19, 2018

[PowerShell] Download file and unzip | 下載檔案與解壓縮

PowerShell is an useful command tool on Windows, here I will show how to download file and unzip it.
PowerShell是個在Windows上很好用的指令列工具,這邊我將展示如何下載檔案和解壓縮。

Download | 下載

We using Invoke-WebRequest to download file in Windows(like wget in linux), the command like this:
我們使用Invoke-WebRequest來在Windows下載檔案(像linux的wget),指令如下:
Invoke-WebRequest -Uri <Uri> -OutFile <String>

By default PowerShell uses TLS 1.0, if your file host's SSL using TLS 1.2, you will got this this error:
PowerShell預設使用TLS 1.0,如果你檔案網站的SSL使用TLS 1.2,你會遇到下面這個錯誤:
Invoke-WebRequest : The request was aborted: Could not create SSL/TLS secure channel.

For this case, you can set PowerShell use TLS 1.2 first to avoid the error by this way.
在這情況,你可以用下面方式設定PowerShell優先使用TLS 1.2來避免這個問題。
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
Invoke-WebRequest -uri https://died.github.io/us-map.zip -outfile map.zip


Unzip | 解壓縮

The command Expand-Archive can help us unzip file, usage like this:
指令Expand-Archive可以幫我們解壓縮檔案,使用方式如下:
Expand-Archive <ZipFile> -DestinationPath <String>

Example | 範例 :
Expand-Archive .\map.zip -DestinationPath .\map\

Friday, March 16, 2018

從近年立委、議員選舉數據來看女性參政與保障名額

台灣是少數國家將婦女保障名額寫入憲法內的國家,但那是1946年的事了,現在已經過了70多年,在當時看來相當需要的情況下產生的制度,是否在現今環境也需要,我找了近二十年的議員與立委選舉數據作為比較,來看看保障名額在現今社會對於選舉的影響。

資料來源:中選會資料庫網站
資料選擇:直轄市區域議員1998~2015,區域立委2001~2016,各五筆

會選擇直轄市區域議員與區域立委的原因是因為剛好前者是有保障名額的,而後者沒有,所以用兩者去比較是蠻恰當的。

經整理數據後做成下面兩個圖表。

直轄市區域議員男女比例


在這張表中,我們可以看到
  1. 女性參選比例從20%逐年提升到31.25%,增加11.25個百分點,提升幅度為51.25%
  2. 女性當選率比男性當選率高出9.76至19.05個百分點,以平均值來說,女性當選率高出男性三成
  3. 男性與女性當選率大致上以同曲線逐年上升(r=0.67)


區域立委男女比例


在這張表中,我們可以看到
  1. 女性參選比例從18.66%逐年提升到25.71%,增加7.05個百分點,提升幅度為37.78%
  2. 女性當選率比男性當選率高出2.5至8.57個百分點,以平均值來說,女性當選率只比男性高出4.7%
  3. 男性與女性當選率以近乎同曲線降低(r=0.97)


從上面兩張圖表分析近五次選舉後,我們可以得到三個結論
  1. 女性參政比例逐年提升
  2. 當選率不分男女皆受當年環境較大影響
  3. 女性參選直轄市區域議員當選率高出男性三成


既然上面分析得出有個結果是女性參選議員較有優勢,那我們來看看區域立委與區域議員的女性參選率是不是也有差別。
snip_20180315174755
將上述五筆選舉資料的女性比例做出比對,得出上圖,發現除了1998年的直轄市議員選舉外,其他後來的年份都高出區域立委20%以上,甚至高到54%的情況,但1998只有7%,數字差異很大,所以我又多找了一筆資料補上去(中選會資料庫的直轄市區域議員就只有六筆,沒辦法更多了),將資料補成這樣。

snip_20180315175841
可以看到很有趣的分水嶺,到底1998~2002中間發生甚麼事,讓直轄市區域議員女性參選大增呢 ?

查了一下之後,發現了1999年一月25日公布的地方制度法,第三十三條中這樣寫著
各選舉區選出之直轄市議員、縣(市)議員、鄉(鎮、市)民代表名額達四人者,應有婦女當選名額一人;超過四人者,每增加四人增一人。直轄市選出之原住民名額在四人以上者,應有婦女當選名額;縣(市)選出之山地原住民、平地原住民名額在四人以上者,應有婦女當選名額;鄉(鎮、市)選出之平地原住民名額在四人以上者,應有婦女當選名額。

看起來感覺上就是這個四分之一的婦女保障名額,讓女性參選議員比例在2002年開始明顯多過於立委,然而這是個講究科學與證據的時代,雖然只有六筆資料不夠多,但將兩者數字去計算相關係數後得出 r = 0.75 ,在社會科學中這代表了兩者有高度相關性。
Capture
很顯然的,1/4的婦女保障名額顯然讓直轄市區域議員女性參選比例高出許多,因為有保障名額後,整體而言女性當選機率比男性來的高,為了正確計算保障名額帶來的優勢,我重新算了最後四次立委與議員選舉的資料做為比對,去除了1999年之前還沒有1/4婦女保障名額的選舉。


Capture
最終結果是這樣,以平均而言,女性參選直轄市區域議員有高達六成(61.71%)的當選機率,比男性的當選機率(46.85%)多了將近十五個百分點(14.86),也就是相比男性參選者高了三成(31.72%)的機會當選。而這樣的優勢,也讓女性參選直轄市區域議員的比例,比起沒有保障名額的區域立委多了三成(29.73%)。

如果你直接拉到最後看結論的話,直接看下面這句就好。
因為婦女保障名額,女性參選直轄市區域議員當選機率高達六成,相比男性參選者高了三成的機會當選,也讓女性參選直轄市區域議員的比例,比起沒有保障名額的區域立委多了三成


個人意見

最後,我想說說我個人的看法,婦女保障名額在ROC體制的產生其實是ROC政府還在南京時候的事情,在當時的歷史環境確實沒有婦女保障名額,是很難有女性參政,而國民黨敗退到台灣後這情況也不會差很多,所以早期的時候我是認同婦女保障名額的,但是時代在變,法規也應該跟著時代進步,以平權的角度來看,近年在台灣參與選舉已經沒有性別上的門檻限制,台灣社會也早就沒了女性不應拋頭露面的觀念,客觀來說性別在參與選舉上是平等的。

雖然早期就在推動兩性平權的呂秀蓮認為婦女保障名額應廢除,女性要的是平權而不是特權,婦女保障名額是對女性的歧視,也是對男性參選者的不公。但近期台灣的「女權主義」者卻不太這樣認為,不但有人認為要提高保障名額,還有所謂學者做出「受保障而當選的女性資歷不亞於她們擠下的男性候選人」這種狗屁不通的研究,然後一堆人藉此引用,跟本不懂這就是"garbage in garbage out"。選舉是民主制度,直接民選就是看選票說話,而不是比資歷,要比資歷的話大家報名資歷比一比就好了,何必投票 ? 何必選舉 ? 這種最根本的道理都不懂,還有臉寫出這種研究真是呵呵,靠性別當選而不是靠選票當選就是反民主也破壞了兩性平權,這種基本的認知很難懂嗎 ?

先撇開台灣的女權是不是只想要特權,讓我們看看Liberté, Égalité, Fraternité(自由,平等,博愛)的來源-法國是怎麼做到兼顧民主、自由、平等的。

其實很簡單,法國對於政黨提名上加了個條件,「政黨提名的候選人性別差距超過百分之二,得到的政黨補助就會隨比例減少」,這是一個非常聰明,一舉數得的做法,優點如下:
  1. 規定提名的候選人而不是保障當選名額,能不能當選還是仰賴民主制度-選票。
  2. 對於政黨用補助去限制,有自由的選擇可以捨棄補助而提名更多某個性別,或是為了補助提名相同數量的候選人,且非政黨不受限制,確保了自由。
  3. 不會有因為性別而落選或當選的情況出現,保障了平等。

真的想要在參政上平權,真心建議廢除保障當選名額這制度,換一個更符合現今社會的方法吧,七十多年前的東西早就不適用於現今台灣社會了。

如果要一句話形容婦女保障名額的話,大概是這樣
婦女保障名額,一個破壞平等、反民主且帶著歧視的過時制度



Tuesday, January 30, 2018

[C#] OpenCvSharp DNN with YOLO2

yolo
On my post "OpenCV DNN speed compare in Python, C#, C++", Blaise Thunderbytes asked me to implement pjreddie's YOLO with OpenCvSharp, so that was why this post came out :P

Since OpenCV 3.3.1, DNN moudle supported parse YOLO models, so we can easily using YOLO pre-trained model now. OpenCv Doc have a tutorial of YOLO object detection writed in C++, if you using C++ can check it, I will using C# with OpenCVSharp.

Wednesday, January 3, 2018

[MSSQL] Set max server memory using command | 用指令設定伺服器最大記憶體

sql_maxmemory3
Few days ago I am testing a issue, set maximum server memory to very low (min limit 128 if you set the value below it) on SSMS, after apply the setting, SSMS pop out error , broken connection from SQL server and can't connect back due to the memory to low can't accept connection.
幾天前我在測一個問題,用SSMS把DB的最大伺服器記憶體設到非常低(系統最低是128MB),執行這個設定後,SSMS跳出錯誤,與SQL伺服器的連線中斷而且因為記憶體太少而連不回去。

I take some time to find out how to change the setting from command line, here is the guide.
我花了點時間找出怎麼用指令把設定改回來,下面是教學。