2018年11月7日 星期三

dropzone 檔案上傳失敗

使用 dropzone 元件處理多檔上傳時,自己電腦的開發環境下測試沒問題,但搬到上線主機時,多檔上傳時會隨機發生上傳失敗的問題。在瀏覽器-開發人員工具(F12)模式下,發現執行上傳檔案的對應程式,出現 404 的錯誤。但實際去連該網址,卻是活著的。

這就讓我懷疑是否因為上傳的檔案太大,直接被 IIS 擋掉了。但我實際檢查 web.config,卻明白寫著:


<system.web>

   <!--設定最大檔案傳輸流量,單位:KB-->
   <httpRuntime maxRequestLength="1000000"/>

</system.web>

這不是很諷刺嗎?可以上傳約 1G 呢。

但當我看了 https://forums.iis.net/t/1150009.aspx 論壇後,終於了解了。

在 IIS7 以後,不能僅僅在 httpRuntime 設定  maxRequestLength 而已,還要加上

<system.webServer>
  <security>
   <requestFiltering>
    <requestLimits maxAllowedContentLength="1000000000" />
   </requestFiltering>
  </security>
</system.webServer>

此外還要注意, maxAllowedContentLength 的單位是 Byte,也就是 1M =1*1024*1024
跟  maxRequestLength 預設是 KB 不一樣

Ref:


2018年7月4日 星期三

Python 取得 today

要在 Python 取得 today 日期,可以用下面語法:

from datetime import date
NowDate=date.today()

#印出 20180704
print(NowDate.strftime('%Y%m%d'))
#印出 2018-07-04
print(NowDate.strftime('%Y-%m-%d'))


關於 date 這物件,有提供 replace 方法,可以讓你針對 year / month / day 做調整。
如果只是針對 year 做修改(例如  +1 年),應該沒甚麼問題;但如果針對 month 或 day 修改,就要考慮會不會出現 13月 、 32日 這種超出界線的問題。實際上,replace 這方法並不會自動幫我們處理跳到下個月或下一年的事情,但他會去檢查 replace 後的日期是否正確。

#故意讓 day 超出界線
NextDaty=NowDate.replace(day=NowDate.day+31)

執行結果的錯誤訊息會是:day is out of range for month

如果想要對 month 或 day 做調整,可以用  timedelta 來完成
但要記得先 import  datetime

from datetime import date
import datetime
NowDate=date.today()
date_1 = datetime.datetime.strptime(NowDate.strftime('%m/%d/%y'), "%m/%d/%y")
#end_date 就會是 31 天之後的日期
end_date = date_1 + datetime.timedelta(days=31)


參考:
01.Adding 5 days to a date in Python
https://stackoverflow.com/questions/6871016/adding-5-days-to-a-date-in-python

02.Getting today's date in YYYY-MM-DD in Python?
https://stackoverflow.com/questions/32490629/getting-todays-date-in-yyyy-mm-dd-in-python


2017年9月15日 星期五

T-SQL 去除 html tag

先前有練習過,使用 C# 把類似 HTML 編輯器所儲存的內容,去掉 HTML Tag,但如果不想用 C# 來寫,而是直接在 SQL Server 上用 T-SQL 就直接完成,是否有這機會呢?

有的,這已經有人寫好了。

我參考了 Pinal Dave 的文章,把它主要的關鍵語法擷取下來:

CREATE FUNCTION [dbo].[clearTag]
(
 -- Add the parameters for the function here
 @HTMLText VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
 DECLARE @Start INT
 DECLARE @End INT
 DECLARE @Length INT
 SET @Start = CHARINDEX('<',@HTMLText) SET @End = 
 CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText)) 
 SET @Length = (@End - @Start) + 1 WHILE @Start > 0
 AND @End > 0
 AND @Length > 0
 BEGIN
 SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')
 SET @Start = CHARINDEX('<',@HTMLText) SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
 SET @Length = (@End - @Start) + 1
 END
 RETURN LTRIM(RTRIM(@HTMLText))

END


主要是在資料庫裡新增一個函數( function),把那些雜亂的內容當作參數傳進這個函數,回傳值則是我們想要的乾淨內容。

而使用方式,則是


select [dbo].[自訂函數名稱]('xxxx html tag')

參考資料:
01.Defined Function to Strip HTML – Parse HTML – No Regular Expression

02.去除 html tag(C# 版)

2017年9月11日 星期一

SQL Server Intellisense Not Working

如果你跟我一樣,使用 SQL Server 2008 R2 搭配 Visual Studio 2010 進行開發。當您頓 Visual Studio 2010 升級了 Service Pack 1 後,有一天發現 SQL Server 2008 R2 的 intellisense 功能不見了,雖然不是什麼大 Bug,但對開發人員來說,還真的非常不方便。

原來是我先前喜孜孜地對 Visual Studio 2010 進行 Service Pack 更新,造成 Intellisense 功能發生問題,這無法透過手動去對 SQL Server Management Studio 針對環境設定而獲得改善。由於 SQL Server 2008R2 距離目前 2017 已經很多年了,所以直接讓 SQL Server 2008R2 更新了 Service Pack3 而解決 Intellisense 失效的問題。

參考:

2017年7月28日 星期五

最恐怖的鬼故事


就在即將進入農曆七月前,我聽到一個最可怕的鬼故事。

小明跑到一家書店,問老闆說,你們這有沒有最可怕的故事書。老闆推推眼鏡,然後冷冷的回答說,有。於是從書架上取下一本書,並告訴小明,這本故事書很特別,每個章節都很恐怖,要價 1000元,你要買嗎?

小明沒有猶豫很久,就跟老闆說,我要買。當老闆把書交給小明之際,低聲的對小明說,有一件事你一定要特別注意,就是「千萬不要翻到最後一頁,千萬要記住喔」。

2017年7月26日 星期三

調整Bootstrap 裡的 input-group 高度

Bootstrap 裡使用  input-group ,可以很輕易的讓使用者建構出鮮明清爽的輸入項目。

但有發現嗎?在備註二,如果內容的文字一多,就會出現這種爆表的現象。

目前找到一個有效的解決方式,就是透過調整 CSS ,針對 .input-group-btn, .input-group .form-control 這些 class 設定  height: auto
但單單僅這樣設定,反而造成其他尚未有 input 內容的畫面變得很乾扁。

所以再針對每一個項目設定了最小高度,例如:min-height: 30px;

經由這樣的設定後,整體呈現總算有及格了。


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default5.aspx.cs" Inherits="Default5" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="http://getbootstrap.com/favicon.ico">    
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
    
    <style>
        .input-group-addon {
            /*設定每個 input-group-addon 都有固定寬度 */
            min-width:180px;
        }

        .input-group{
            padding-bottom:2px;
        }

        /*自動根據內容調整高度,同時設定最小高度*/
        .input-group-btn, .input-group .form-control
        {
            height: auto;
            min-height: 30px;
        }
    </style>

</head>
<body>
    <form id="form1" runat="server">
    <div class="container">

        <div>
        &nbsp;
        </div>

        <div class="row">
            <div class="col-md-6">
                <div class="input-group">
                    <span class="input-group-addon">學生姓名</span>
                        <asp:Label id="lb_學生姓名" runat="server"  CssClass="form-control" Text="張小明" ></asp:Label> 
                </div>
            </div>
            <div class="col-md-6">
                <div class="input-group">
                    <span class="input-group-addon">年級班級</span>
                        <asp:Label id="lb_班級" runat="server"  CssClass="form-control" Text="五年一班" ></asp:Label> 
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-md-6">
                <div class="input-group">
                    <span class="input-group-addon">備註一</span>
                        <asp:Label id="lb_備註一" runat="server"  CssClass="form-control" Text="" ></asp:Label> 
                </div>
            </div>
            <div class="col-md-6">
                <div class="input-group">
                    <span class="input-group-addon">備註二</span>
                        <asp:Label id="lb_備註二" runat="server"  CssClass="form-control" Text="2014年校慶運動會跑步第一名<br>2015年校慶運動會跑步第二名<br>2016年全國運動會跑步第一名" ></asp:Label> 
                </div>
            </div>
        </div>
    </div>
    </form>
</body>
</html>



參考:.input-group-lg causes textarea's height to shrink to a single line

2016年12月1日 星期四

SSRS 報表使用上下標數字

是否有比較好的方法,在 Reporting Service 報表裡面使用上標(superscripts)、下標(subscripts)數字呢?

這個看似簡單的需求,目前的 Reporting Service 報表設計工具,似乎沒有很直覺簡單的處理方式。有人會建議,那就放圖片吧,這可行,但是圖片大小可能會因為報表的放大、縮小而失真,對工程師而言,要找到解析度剛好的圖片,其實不是一件容易的事。剩下比較常見的,就是透過 Unicode 的方式,取得上標或下標的數字,來完成我們的工作。

剛好最近的需求,是同時會用到數字的上標與下標,同時看到 SQLJason 裡的一篇文章,覺得很有價值。

他提出兩種方法。

第一種:是透過 chrw( ) 函數。把作者整理出來的圖表節錄如下,我們把 Superscript 的內容放到 chrw( ) 裡,就可以得到我們想要的上標了。



在報表裡,我們只需要再文字方塊的 Expression 裡面輸入:
="2"&chrw(178)

就可以得到 2 的平方。

※補充:20170120
如果還有其他想要加入的文字,可以透過 charmap.exe 打開字元對應表,並在其中找到想要的字符,此時要注意的有兩件事,第一是最上面的「字形」,要能夠正確顯示出內容,如果字型沒正確指定,則會出現亂碼。第二,是最下面的訊息框,它會顯示目前該字符的Unicode,但我們不能直接把它放到 chrw()裡面,因為他是 16 進位,所以要把它轉換成 10 進位的數字,可以到 convert 網頁把它轉換為 10 進位後,再放到 chrw()裡。



第二種:可以透過電腦的執行命令列,輸入 charmap.exe


就可以跳出字元對應表,這時,先在字型的下拉選項中挑選 Lucida Sans Unicode,接著你就可以在下方的字元清單中找到你想要的字,包含上標、下標的數字都有。


當你找到之後,就可以按選取,把他存放到「要複製的字元」,接著繼續挑,直到您滿意為止,最後再按「複製」。接著,就到報表設計工具,找到文字輸入方塊,點兩下後,直接用 Ctrl+V 貼上,這時,還要做一個動作,就是將文字輸入方塊的屬性裡的 FontFamily,也要設成:Lucida Sans Unicode。這樣,就可以正常顯示上下標文字了。



參考文章:
01.Subscripts and Superscripts in SSRS Reports

02.SSRS Reports – Displaying Superscripts and Subscripts