星期二, 5月 31, 2016

救回 Windows 作業系統下被封印的 USB 磁碟空間

明明就是 16GB 的新 USB Disk,在 Mac 使用正常,跑到 Windows 不但提示要格式化才能使用,而且空間只有 200MB?救命文在

星期三, 5月 18, 2016

放寬 IIS 7 上傳大檔的限制

如圖。值得注意的是有兩個設定值影響,而且一個單位是位元組,另一個是仟位元組。

自動更新的 IIS / IIS Express 網站建置時戳

在網站開發期,由於要經常建置、部署、測試,常會有一個困擾,那就是「不容易識別目前在執行的網站版本」。如果有個政策是「每次部署都人工修改頁面上的版本資訊」固然可以,但難保不會忘了做。
為了解決這種問題,我的做法是在首頁引入以下的檔案:
  • <script src="lastBuild.js"></script>
並且在頁尾安排顯示的位置,
  • <div id="lastBuild"></div>
當頁面載入時,更新內容:
  • <script>
  •     $(function () {
  •         $("#lastBuild").text("lastBuild: " + lastBuild);
  •     });
  • </script>
重點是 lastBuild.js 的內容,藉由 Visual Studio 編輯 Pre-build event command line 動態產生,指令為:
  • set output=../lastBuild.js
  • echo | set /p dummy = "var lastBuild = '" > %output%
  • FOR /f %%a in ('WMIC OS GET LocalDateTime ^| find "."') DO set D=%%a
  • set timestamp=%D:~0,4%/%D:~4,2%/%D:~6,2%T%D:~8,2%:%D:~10,2%:%D:~12,2%';
  • echo | set /p dummy = %timestamp% >> %output%
有些值得說明的地方,例如第 1 行定義產檔位置在上層目錄(否則可能預設在 bin\);第 2, 5 行的 echo | set /p dummy = 而不是單純用 echo,為的是避免多餘的空行;第 3 行的 WMIC 指令用來取日期,若單純用 date 指令會受 Locale 影響年月日的順序,find "." 也是用來過濾掉多餘的其他行;第 4 行用來格式化時戳字串。如此在每次建置時,產生出來的 lastBuild.js 內容就會像這樣:
  • var lastBuild = '2016/05/18T17:09:15';
在頁尾的顯示會像這樣:
  • lastBuild: 2016/05/18T17:09:15

星期三, 5月 11, 2016

Visual Studio Web Publish on many Configurations

過去一直沒搞清楚這幾個 Configurations 有什麼不同?


其實很簡單:最上面是 Solution 的,中間是 Project 的,下面是從 Publish Web 開出來,當然就是「發行網站」的組態設定。但這又是什麼?
在此又牽涉到另一個過去沒搞清楚的:到底 Web.config 下面多出那兩個是什麼?


事實上那就呼應到發行網站時可以搭配的多種組態啦!那是直接編輯各個組態檔嗎?可以是,也可以不是。因為實務上絕大部份的組態設定在不同組態下都是相同的,如果因此就複製貼上一大段實在不智,正規的做法如下:


如此在發行網站時,就會即時計算與組態匹配的內容,動態地產生調整後的 Web.config 供發行使用。在此例中,當 Publish Configuration = Release 時,Connection1 的 Server=Development... 會被置換成 Server=Release...,但 Connection2、Connection3 將繼承原本的 Web.config。

星期六, 4月 30, 2016

IIS 主機上「其他」檔案存取

為了要取得 IIS 主機上的一些「非」網站內檔案(例如紀錄檔),過去的經驗都是另開遠端桌面,但限於授權數量,當很多人都需要的時候就不方便了。
其實早就有 WebDAV 可以利用,但只能開放網站所在位置的實體目錄?如果紀錄檔在 D:\ 而網站在 C:\inetpub\wwwroot?不是問題,可以在網站上掛虛擬目錄。
在使用端如何掛 WebDAV 分享出來的目錄?設「網路連線磁碟機」,在資料夾的設定不同於常見的 \\server\share 形式,而是像 http://host/share 這樣。
WebDAV 設定需要注意的是:
  • 需要開啟 Enable
  • 編寫規則
  • 相關設定
  • 授權給匿名或特定角色、使用者
  • 搭配網站的認證授權設定

讓 Linux 認得 Windows 主機

有些內部網站像是 http://hostname 而不是 http://www.domain.com 這種形式,通常較多人用 Windows,瀏覽器找得到 http://hostname 這種位置,但在 Linux 上就不行了。只好先查 hostname 對應的私有 IP 位址,瀏覽器再找 http://x.x.x.x 才行,有沒有更好的解法呢?

首先要知道一般 Windows 為什麼認得較短的電腦名稱?這種是 NetBIOS name,與較長的 FQDN 不同,只要在內網唯一就可以了,負責管理的是 WINS。

在 Linux 上要認得 WINS 可以透過安裝 SAMBA(這是個逆向工程的經典),然後在 smb.conf [global] 設定 wins server = x.x.x.x 就可以了,其他常用的 workgroup、netbios name 或是 security 都與主題無關,注意不要設 wins support = yes。

在驗證效果時我也一直有個錯誤的觀念,以為在 Linux 應該可以 ping hostname?但還不行,nsswitch.conf 也要改,其中有一項 hosts: 必須把 wins 加進去。

[2018/05/21]
如果在 Linux 上僅安裝 samba-client 也是可以的,例如先查好 WINS 的位址在 172.16.1.2,要找的機器名稱為 Win10,指令是:
  • nmblookup -U 172.16.1.2 -R 'Win10'

星期五, 4月 22, 2016

Excel 的日期舊臭蟲

聽說有人用 KendoGrid 從 SQL Server 抓資料呈現沒問題,但再匯出 Excel 時竟有些日期會自動加一天,懷疑 KendoGrid 有問題?深入追查後發現:SQL Server 日期欄位沒資料時的 1900/1/1 竟然撞上 Excel 繼承 Lotus 1-2-3 留下的一個 bug,能活這麼久,這應該算程式界的小強吧?這篇有許多詳盡又有意思的說明。