星期四, 8月 28, 2014

Captcha not supported by Safari

意外!還好現在這不是我的問題,以後再找解法。

GAE 資料的異常

有個在 GAE 已好一陣子的專案,因為最近部署前多做了一個清除的動作,導致以下這種令人摸不著頭緒的錯誤:

javax.jdo.JDOUserException: Persistent class "Class blar.blar.blar does not seem to have been enhanced. You may want to rerun the enhancer and check for errors in the output." has no table in the database, but the operation requires it. Please check the specification of the MetaData for this class.

blar.blar.blar 明明就是早八百年前都在讀寫的資料持久化類別,怎麼可能不見?去 Google 一下,原來別人也發生過,而且解法也令人意想不到:
  • 編輯 Project > properties > Google > App Engine > ORM
  • 移除 src/
  • 新增 src/blar/blar/*.java
重新部署上雲端,總算救回來了。

javascript trim() not supported

這應該算蠻常用的功能,但在 IE 8 或更早的版本都不支援,因此要請 jQuery 幫忙,或參考 MDN 上一個漂亮的解法:

if (!String.prototype.trim) {
  String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g, '');
  };
}
不過有時候問題的本質並沒這麼複雜,例如只想要確定欄位是否有輸入任何字,但零到多個空白都算是沒輸入的話,其實這樣也夠了:
  • var trimmed = window.document.getElementById("someField").value.replace(/ /g, "");
  • if (trimmed == "") {
  •    alert("nothing");
  • }

建立 MS SQL 資料庫,或當已存在時打掉重建

DECLARE @Database sysname;
DECLARE @Collate varchar(MAX);
SET @Database = 'Your_Database_Name';
SET @Collate = 'Chinese_Taiwan_Stroke_Bin';

IF (@Database LIKE '%[^0-9A-Z_]%')
    RAISERROR('Invalid Characters in Name, %s', 16, 1, @Database);
ELSE
    DECLARE @Quote varchar(MAX);
    SET @Quote = QUOTENAME(@Database);
    USE master;
    IF EXISTS (SELECT * FROM sys.databases WHERE Name = @Database)
        BEGIN
            EXEC('ALTER DATABASE ' + @Quote + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE');
            EXEC('DROP DATABASE ' + @Quote);
        END
    EXEC('CREATE DATABASE ' + @Quote + ' COLLATE ' + @Collate);
    EXEC('ALTER DATABASE ' + @Quote + ' SET MULTI_USER WITH ROLLBACK IMMEDIATE');

星期四, 8月 07, 2014

Web Notifications

新玩意兒!不過暫時只能在非 IE 上跑。可參考 https://developer.mozilla.org/en-US/docs/Web/API/notification

在 html table 列間插入 hr

因為 <hr> 總是會被瀏覽器在排版的時候丟到 <table> 外面去,變通做法如下:

<table style="border-collapse: collapse;">
    <tr>
        <td>1</td>
    </tr>
    <tr>
        <td>2</td>
    </tr>
    <!-- <hr /> -->
    <tr style="border-bottom: 1px solid black;">
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>A</td>
    </tr>
</table>

星期六, 8月 02, 2014

在瀏覽器取得時區

利用 JavaScript,可以取得 GMT±hhmm 這樣的字串,傳回伺服端用以(國際標準時區)日期時間轉字串處理。
  • 34: 因為 getTimezoneOffset() 回傳的是「加上這個值成為 GMT」,與我想要的「GMT 加上這個值成為當地時間」意義相反,所以變號處理。
  • 36: 負值一律變正,已便後續統一處理正值即可。
  • 42: 不是每個時區與 GMT 都恰好只差幾個小時,也有不整除的。
  • 44 ~ 49: 時、分都補滿到兩位數。