标簽/Tag為[MT]的文章 [ 1/4 ]

[MT Plugin]全新改寫的 Markdown 解析插件 ,

一直在用 Markdown 寫Blog。
總覺得貌似解析效率有點不高。何況引入 代碼高亮 後,處理代碼顯示是個問題。

檢查了 MT 自帶的 Markdown 解析插件 ( plugins/Markdown/Markdown.pl ) , 原來是 John Gruber 2004 寫的第一版。

My God , so oooold。。。

John Gruber 這個原代碼寫的很經典, 但是究竟很老了。。

使用Nginx的proxy_cache功能緩存MT Tags ,

This is a sitelog of .

一直以來,本站的 MT tag search 都使用的自己寫的 Perl 腳本來緩存 後台 mt-search.cgi 的結果。 前台僞靜态成 tag/key 模式。

詳細介紹在這裡:

  1. MT歸檔頁面變更以及Tags搜索頁面cache機制的變更
  2. 本站使用的文本緩存Tag搜索的Perl腳本

評論模式的小小改變和JS重寫 ,,

This is a sitelog of .

因為 PSGI 運行 MT ,貌似服務器執行效率不再是瓶頸, so 漸漸取消了了一些為了節省資源的"優化",簡單記錄如下:

  1. 評論後博文重建的改變
    原來為了效率。我的博文頁其實有兩個。一個是博文本身,另一個是 json 格式的評論全集。 比如這個: /blog/archives/json/311.json。 當每次有新的評論發表時候,我的原設計是并不刷新本頁,隻是重載 json 罷了。 通過自寫的 JSjson 中的所有評論更新一遍。 而且每個頁面的評論也都加入了"刷新" 和"重載"兩個按鈕。 其中"刷新"的含義是重載 json 文件, "重載"則從數據庫重載。 抓圖如下:
    舊模式評論
    而現在,考慮再三, 取消了 json 格式的博文頁, 減少一次服務器寫文件的次數? 同理,改寫了 JS,移除了在加載文件同時加載 json 文件。 當然,保留了從數據庫直接重載評論的設計。 順便改了一下 "重載" 的 UI,讓它更 醒目 一點 (也許是更*醜陋*了一點。哈哈),抓圖如下:
    新模式評論

增加 GitHub 賬号登陸 Movable Type 及全站搜索頁面恢複 ,

又是愚人節,隻是這個愚人節需要上班, 但願通知大家上班的信息不要當作愚人節信息而忽略,這樣的話估計就欲哭無淚了。呵呵 :D

Blog 自從複活以來,一直修修補補,說說最近的一些變化吧:) 簡單如下:

[筆記]CentOS6 nginx下安裝MT-PSGI環境的全過程

PSGI 運行 MovableType,是一直的夢想,說實在的,慢如蝸牛的 MT 後台已經早已厭倦了。隻是不舍得轉化到 WordPress 平台而已。

切換到了 vultr VPS + nginx, 這個願望可以說距離實現近了一步,隻是小有瓶頸,因為原版的 mt-starman-daemon 是針對 Debian 的。 移植到 CentOS6 上需要小小改動。

廢話不說,直接記錄過程吧。

先上幾個參考教程:

  1. https://github.com/saahov/mt-starman-daemon
  2. http://www.centoscn.com/CentOS/help/2016/1209/8270.html
  3. https://www.tonyhead.com/archive/2014/08111250

PSGI 環境下的MT留言IP問題,其實很簡單 ,

切換 MT 運行環境為nginx + PSGI,後台速度的确刷一下上去了。 但是,由于是所有的 cgi/pl 文件其實都交給了服務器的 mt-starman-daemon 本地網關守護進程, 所以所有的程序的來訪IP都會變成 127.0.0.1 。 檢查一下後台日志,的确如此,其他都不重要,但是留言/評論 的IP地址就不能不說遺憾。

檢查配置 mt-starman-daemon 時的增加的 nginx 設置,如下:

codelocation /cgi-bin/mt/ {
proxy_set_headerHost $http_host;
proxy_set_headerX-Forwarded-Host $host;
proxy_set_headerX-Real-IP $remote_addr;
proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://starman;
}

配置中明确有原始訪問的IP。。 那麼還是看 MT 的程序。 根據直覺,直接查看 MT/App.pm, 搜索關鍵詞 $ENV{REMOTE_ADDR},結果定位到如下:

codemy $trusted = $app->config->TransparentProxyIPs || 0;
my $remote_ip = (
$ENV{MOD_PERL}
? $app->{apache}->connection->remote_ip
: $ENV{REMOTE_ADDR}
);
$remote_ip ||= '127.0.0.1';
my $ip
= $trusted
? $app->get_header('X-Forwarded-For')
: $remote_ip;

呃, MT 本身就有這個功能。。。。。也就是 TransparentProxyIPs 。 這下簡單了。 打開 mt-config.cgi, 增加以下設置:

TransparentProxyIPs 1

保存。 重啟動 mt-starman-daemon。

再次發一條評論,測試可以正常獲取原始IP地址。

彎路一堆。 幸好OK。

MovableType.org 一搜索。有詳細解釋,地址如下: https://movabletype.org/documentation/appendices/config-directives/transparentproxyips.html

-bbb。

Anyway,解決就好。

--EOF--

博客複活與調整 ,

網站帶病運行一年,博客也中斷更新一年。貌似今天又繼續開寫了。中斷的原因基本上是因為懶、切換服務器加上一些額外的狀況。

簡單說說:

  1. 切換服務器:去年 3 月份的時候,主機就到期了。當時因為看大家的VPS都不錯。就準備也試試。于是在2016年3月切換到了 vultr 。當時選擇的東京機房的LEMP 方案,CentOS6x64系統,25GB SSD,1 CPU 1024MB Memory, 1000GB Bandwidth,每月5美元。 由于從 apache 切換到 nginx 。很多設置無法平滑過渡。故而簡單給nginx添加Perl-CGI 的支持(Fast-CGI 模式)後就先運行了。切換完成後,導緻無擴展名的Perl文件無法運行,跨域驗證無設置導緻主頁分頁無法正常運行,apache 和 nginx 的 rewrite 規則不兼容導緻 tag 目錄完全失效等等。
  2. 懶: 切換服務器後,想法很大: 準備研究以 PSGI 運行 MovableType,徹底解決 MovableType 瓶頸,但是發現在 CentOS nginx 上安裝 mt-starman-daemon 有一定的技術瓶頸。而 nginx 對 pathinfo 的 不支持 也讓以前寫的後台腳本不能直接使用,nginx 的rewrite 規則居然需要重啟 nginx 才能實現,沒有面闆的VPS,實在的懶得SSH 下敲命令,故而就拖了下來。。。。 總之,明日複明日。。 而系統的馬馬虎虎運行也自然沒有寫東西的欲望。。
  3. 瑣事甚多:這一年,遭遇家人住院,工作變動等諸多因素,然後在博客投入的精力自然就不會太多。。。

回歸正傳,最近抽出了一點時間,做了一些調整之後,博客的所有的功能都已經修複,也成功的實現了 nginx + PSGI 運行 MovableType,重新享受數年前的飛一般的後台速度。。。 一段時間沒有上vultr 控制主頁,發現vultr 居然推出了2.5美元的産品? 不過僅僅是空白VPS,啥都需要自己裝。。。也許接下折騰就是從 $5/mon 折騰到 $2.5/mo。

PS: 雖然是帶病運行,但是 vultr VPS 也算滿一年了,話說其性價比和穩定性都算比較好的。有需要VPS的還是可以考慮一下。 vultr VPS 對新用戶很優惠,新用戶注冊完成後支付充值5美元後送20美元,可惜我 2016年3元就注冊了。無法享受贈送。

接下來,有時間整理的話,我會把 在 CentOS6 系統的 nginx + PSGI 運行 MovableType 的過程分享給大家 :)

--EOF--

[雜記]臨時下線多說評論系統和 MovableType 6.2 發布 ,

時間總是飛速。 轉眼國慶長假已經過去一周?

博客也好久沒有更新了。 随便寫點記錄。

  1. 臨時下線多說評論系統,原因嘛。最近的的多說越來越不正常了。。。評論顯示不全,陣發性評論框不顯示等等。。。。
    既然本博的每條多說評論都實現了實時寫回本地數據庫,不存在丢失評論問題,那麼暫時下架吧。。
    下線的辦法也很簡單。 僅僅在我自己寫的 js 中 設置easunConfig.load_duoshuo = false; 就萬事大吉。

  2. MovableType 6.2 發布了。
    其實貌似發布在 10月8日。隻是一直沒有去看而已。
    仔細看了一下說明,主要更新為:

New and enhanced asset management features:

Upload multiple files asynchronously

You can upload multiple files by drag-and-drop from the posting screen and also from the "Upload Asset" menu. When upload is finished, you can edit the name, description and tags on the fly. Edit images easily

This new feature provide image editing function. You can scale images, rotate images and cropping images before to inserting the entries and web pages. Also, you can remove the GPS metadata and EXIF metadata. Default upload settings

Website administrator (and Blog administrator) can configure default settings for upload that including default upload destination and more.

Data API v3

Changed the authentication password

In the Data API v3, authentication password for "/authentication" endpoint was changed from user's password to user's web services password. The reason is security improvement. v1 and v2 are not changed. Possible to filter by date range.

The endpoints that list the objects such as listEntries, can now do filtering by date range.

主要熱點為 多附件拖動上傳。 因為打算停留在 5.x ,也就了解一下,跟新的朋友可以升級。

--EOF--

Movable Type 和 JS 删除 cookie 操作的彎路 ,

This is a sitelog of .

話說: Movable Type 用戶登錄後退出貌似是/path_to_mt/mt.cp?__mode=logout&...

然後 302 回到當前頁面。

這個過程究竟是幹什麼呢? 首先清理掉了 Session,這個是必須服務器支持的。

那麼問題來了, 能不能不 302 ,直接我用 ajax 訪問 上面的那個鍊接 OK ? 測試了一下。貌似 js 清除的 cookie 的值 mt_blog_user 為隻是前台使用的。 後台使用還有 "mt_commenter","commenter_name","commenter_id" 這三個 cookie。 而 302 回原來界面的時候會清除這些 cookie.

知道了答案,于是開始修改,邏輯很清楚,ajax 訪問上面的鍊接,清除服務器Session,然後自己寫JS,清除這些 cookie,不就和原來邏輯一樣了嗎? 這樣,點"退出"的時候頁面不會跳轉,會友好的多。

修改如下:

  1. 增加 clear_login_cookie 函數:如下

    javascriptfunction clear_login_cookie() {
    var name_array = ["mt_commenter","commenter_name","commenter_id"];
    var i = name_array.length;
    while (i--) {
    var name= name_array[i];
    mtDeleteCookie(name,mtCookiePath, mtCookieDomain,
    location.protocol == 'https:');
    }
    }
    ```
    
  2. 修改 mtSignOut 函數。
    定位 location.href = url; 修改為:

    code//location.href = url;
    clear_login_cookie();
    $.get(url, {ajax:'1'});
    mtFireEvent('usersignin');
    

    以為萬事大吉,結果,運行之,發現雖然顯示退出了, 但是mt_commenter","commenter_name","commenter_id 三個 cookie 并沒有清理掉???

多處 Debug 無果, 最後又回歸到了原來的模式,仔細研究了一下直接訪問 302cookie 設定:

mt_commenter=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMT

commenter_name=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMT

commenter_id=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMT

呃,貌似根本沒有 CookieDomain 設定。。。。 根本原因在于:

JS如果要删除(重新設置)某個 cookie ,必須知道原來設置的 pathdomain,不然會認為是完全不同的兩個 cookie , 而悲催的事情是 js 無法獲知原來設置的 cookie 的 pathdomain的。

原因知道了,隻好硬編碼了。幸好 mtCookiePath 定義的本身就是 /,回到 function clear_login_cookie(),重寫如下:

code <!--lang:javascript-->
function clear_login_cookie() {
var name_array = ["mt_commenter","commenter_name","commenter_id"];
var i = name_array.length;
while (i--) {
var name= name_array[i];
mtDeleteCookie(name,mtCookiePath);
}
}

再次測試,一切 OK 。 但是彎路浪費了我 N 長時間。 記下來供同好者鑒。

吐槽一下: 為什麼 Movable Type 設定這些 cookie 要和 公開的 cookie (mt_blog_user) 設定不同的 pathdomain 呢? 費解。

--EOF--

[JS随筆]網站評論、顯示界面細微調整和雜談 ,,

随筆寫下一些東西,作為 SiteLog 和備忘。

都是一些評論、顯示界面的調整,一個意圖:用戶體驗。 說的不好聽的就是"路楊的強迫症又犯了",反正是折騰無極限。。

這兩個月, 整個 Blog 的 js 估計被我修改過不下10次,有些是純粹為了閉包,有些是為了美觀和清晰流程。。。

簡單記下曾經的修改吧。

先說前端:

  1. ajax提交優化。 所有流程徹底閉包為一個函數,和 json 顯示本地評論互動,增加了提交成功後如果通過審查的話,動态加載新評論及動畫,并同時重置評論提交表單。
  2. 多說評論界面優化。 綁定了原來系統的顯示/隐藏評論、 顯示/隐藏評論框的函數,讓原來界面的操作同時操作兩個系統的界面。 在 SOTHINK提示下,雖然依然設置多說評論框為默認,但是登錄本地系統(包括QQ等本地系統支持的社交帳号)的朋友則顯示"本地評論系統評論框"。 代碼片段為:

    codevar check_mt_user = function(u) {
    if(typeof duoshuoQuery.is_ds_hide =='undefined') {
    if (!u) u = w.mtGetUser();
    if (u && u.is_authenticated) { duoshuoQuery.is_ds_hide=true;}
    else duoshuoQuery.is_ds_hide=false;
    }
    };
    
  3. 本地json評論界面優化。 徹底完成本地評論js的閉包。進一步和多說評論界面糅合, 增加了刷新重載 兩個操作界面,前者從本地文本靜态json cache中重新獲取本地評論,後者讀取 MySQL 庫實時獲取本地評論。

  4. 延遲加載圖片重寫。 也完成了一次JS閉包。 美化了延遲加載圖片時候占位的動畫,因為目前本站僅在評論者頭像上使用延遲加載圖片技術,也許大家并不能徹底體驗到界面的加載過程(因為加載的太快了)。。。

上面的所有修改,均可以查看本站現有 JS 來獲得代碼。 本站的 JS 并無加密 :P

再說後台:

  1. 徹底解決了QQ頭像、Gravatar 頭像顯示問題。 并緩存Gravatar 頭像到本地。 不同原來的做法。這次寫 插件,直接 hook 了 MT::Author::userpic_url 。 比較極端的做法。 代碼如下:

    codeour($old);
    {
    no warnings 'redefine';
    no strict 'refs';
    require MT::Author;
    If ($old = MT::Author->can('userpic_url')) {
    *MT::Author::userpic_url = sub{
    my ($author) = @_;
    if ( ($author->auth_type =~ m/^QQ/ ) && $author->hint && ($author->hint=~ m!^https?://!) ) { return $author->hint. '#QQ' ;}
    my ($oldurl) = $old->(@_);
    return $oldurl if ($oldurl);
    my $email = $author->email;
    return &_hdlr_gravatar_url_mail($email);
    };
    }
    }
    
  2. 更換了後台插入圖片後的顯示,适應 HTML5。 這個沒有寫插件,直接Hacklib/MT/Asset/Image.pm 中的 can_html 。 更加的簡單粗暴。 代碼片段如下:

    code$text = sprintf(
    '<figure class="post-image"><img title="%s" src="%s" %s %s /></figure>',
    MT::Util::encode_html( $asset->label ),
    MT::Util::encode_html( $asset->url ),
    undef,undef,
    );
    

要查看詳細的修改文件,可以移步到我的 GitHub

其他:

話說,多說 服務器維護了。 貌似以為會好一點,結果似乎結果一樣? 另外,多說評論加載不出來時候,下面的加載動畫一直顯示的時候, 這個時候刷新就OK了,覺很奇怪, 查看了一下 log。 結果,100% 的在出現這個狀态的時候,浏覽器報錯:

17:24:55.691 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://easun.duoshuo.com/api/threads/listPosts.json?thread_key=301&author_key=1&url=http%3A%2F%2F%2Fblog%2Farchives%2Fgodaddy_cpanel_perl_dbdmysql.html&title=Godaddy%20cPanel%20%E4%B8%BB%E6%9C%BA%E5%92%8C%20Perl%E6%A8%A1%E5%9D%97%20DBD%3Amysql&require=site%2Cvisitor%2Cnonce%2Clang%2Cunread%2Clog%2CextraCss&site_ims=1442293934&lang_ims=1442293934&referer=http%3A%2F%2F%2Fblog%2F&v=15.4.27. (Reason: CORS header 'Access-Control-Allow-Origin' missing).1

幹啥子嘛~~
明顯的服務器響應問題。。。
判斷跨域的服務端腳本的得到沒有執行。。
其實listPosts.json 返回數據了,可惜被浏覽器拒絕了。 難怪不顯示。。。。。。
話說,抛開 服務器 判斷跨域的服務端腳本的問題。 listPosts.json 難道一定要用 JSON 模式? 又不是 POST, GET 而已,換成 JSONP 模式不就萬事大吉了,而且也能節省服務器的判斷跨域,輸出 Access-Control-Allow-Origin header。。。。。。

另外,服務器維護了, 貌似腳本的版本還是 2015-04-27 。。。。

--EOF--

[随筆]關于 JS 和 ajax 提交評論等等 ,

This is a sitelog of .

因為 本地評論 JS 化,又重寫了一遍 MTajax 提交過程。梳理了一下流程。

主要是删除了 MT 提交過程的 2次服務器認證,把第一次服務器認證(登錄信息預提交驗證) mtCommentSessionVerify 有限度地交給 JS + cookie

簡單的說,就是設置全局變量 usernull,然後重新在 cookie 中讀取 user 來判斷登錄信息是否正常? 然後其他的認證在 提交表格 時完成就好。 簡單 JS 片段如下:

code var refresh_user = function(u) {
if (u) mtSetUser(u);
if (!u) { user = null; mtFireEvent('usersignin'); u = mtGetUser(); }
if ( u && u.is_authenticated ) { /* do nothing*/ }
else { $f.find(':input[name="sid"]').attr("value","") ; ShowCommentsOpenData(); }
};

然後發現 JQ $.ajax 的小問題:

我的 $.ajax 如下:

code$.ajax({
type: 'POST',
cache:false,
url: url,
context: el,
xhrFields: { withCredentials: true },
data: $f.serialize(),
success: successfuc,
beforeSend:beforefun,
error: errorfun,
complete:completefuc
});

本來是吧 refresh_user 寫到 beforeSend 中的,但是執行的時候發現 refresh_user 中對 $f 的改變,并沒有在 data: $f.serialize() 中 體現出來。 所以隻好顯式在 $.ajax 前調用此函數了。

筆記下來,為自己提醒。

另外,本來對 JS 全面進行 JQ 改寫來着,但是實際對 form 元素操作中發現,同樣對

code<form name="comments_form" id="comments-form">
<input type="hidden" name="preview" value="" />
...
</form>

中 的 name="preview"value 操作。 原來的代碼是

codevar f = document['comments_form'];
if (f.preview.value == '') f.preview.value = '1';

JQ 呢? 貌似。。。。。

codevar $f = $("#comments-form");
var $preview= $f.find(':input[name="preview"]');
if ($preview.attr("value") == '') $preview.attr("value","1");

f$f 是為了方便操作預先定義好的。 貌似還是不用 JQ 操作的快一點。或者就現在這樣混合用吧。。。。

另外,給 ajax 提交完成後刷新新評論搞了一段簡單的 JQ 特效: 代碼如下:

code var animate_item = function(id) {
var $el =$("#comments-content .comment#comment-"+id);
var _top = $el.offset().top - ( $(window).height() - $el.height() )/2;
$("html,body").animate({scrollTop:_top},1000);
$el.addClass("notice")
.animate({left:'30px',opacity:'0.2'},"slow")
.animate({left:'0px',right:'30px',opacity:'0.8'},"slow")
.animate({left:'0px',right:'0px',top:'30px',opacity:'0.2'},"slow")
.animate({left:'0px',right:'0px',top:'0px',bottom:'30px',opacity:'0.8'},"slow")
.animate({left:'0px',right:'0px',top:'0px',bottom:'0px',opacity:'1'},"slow");
var total= parseInt( $("#comments").attr("data-total"));
function c() { $el.removeClass("notice").addClass( (total%2) ? "odd":"even" ); }
$el.one('click',c).one('mouseover',c);
};

沒有抓 gif ,簡單完成效果如下:

jq_submit_png.png

--EOF--

[MT Plugin]QQ互聯插件-用QQ賬号登陸您的MT ,

QQ互聯插件-用QQ賬号登陸您的MT

( QQ Connect Commenters Plugin for Movable Type )

Authors: 路楊 (EasunLee) Copyright 2015 . License: Artistic, licensed under the same terms as Perl itself

qq_login.png

概述

MT QQ互聯插件 (QQ Connect Commenters plugin for Movable Type) 允許用戶用 QQ 号碼登陸你的 Movable Type 博客。
本插件嚴格使用 QQ互聯 的 Open API 編寫。安全可靠。 它可以給您的博客帶來良好的用戶體驗。 一旦使用這個插件,評論者可以自動獲取QQ昵稱、頭像等資源。

請注意: QQ互聯 (QQ Connect)官方使用的機制是審核制度,并不是使用這個插件就直接可以使用QQ登陸。 您需要去 QQ互聯 (QQ Connect) 官方注冊您使用本插件的網站并獲取屬于自己的 APPID 并提交審核。審核過程可能需要1周或者更長時間。

關于 QQ互聯 (QQ Connect) 的注冊,請 百度 之。或者讀取官方資料: http://wiki.connect.qq.com/

運行環境

  • Movable Type 4.2 或者更高版本
  • JSON::XS 2.0 或者更高版本
  • jQuery (非必需,建議)

Movable Type 的 extlib 中已經包含了必需的 JSON:XS 版本。

安裝

  1. 下載并解壓本插件。

  2. 複制(上傳) QQCommenters/mt-static 下的内容到 /path/to/mt/mt-static/

  3. 複制(上傳) QQCommenters/plugins 下的内容到 /path/to/mt/plugins/

  4. 登陸您的 Movable Type 後台 -> Plugin Settings 去設置您的 QQ APP IDAPP KEY

  5. 在 後台->Registration Settings -> Authentication Methods 中選啟用 QQ 。
  6. 在前台選擇登陸,您會看見 QQ 登陸 的選項已經有了。 如果您的網站通過審核,可以之直接使用了。

關于 QQ互聯 功能的申請

關于 QQ互聯 功能的申請,簡單減少一下流程:

  1. 用您的QQ賬号登陸 http://connect.qq.com/intro/login 并申請網站接入。
  2. 詳細描述您要接入的網站信息。請注意 回調地址 一定要填寫為*您的Movable Type 後台 CommentScript 的完整地址,并且帶上 http:// 或者 https:// 的前綴*。比如 (http://your_domain/cgi-bin/mt/mt-comments.cgi)。
    可以設置多個回調地址,用 分号 分開即可。 QQ互聯 (QQ Connect) 的官方APP幫助文檔 寫的像漿糊一樣,而且處處錯誤。這個地方官方文檔寫就是有問題。
  3. 騰訊 的QQ 登陸審核一個要求,就是登陸頁面要設置 醒目的QQ登錄入口。而我們的前端如果不做修改的話,會很簡潔,這個就需要自己在前台放端代碼。 簡單的分享一下我的一些前端 JS 代碼:

[随筆]Movable Type 的數據庫瓶頸與多說評論反向同步 ,

随筆 而已,能力所限,隻是個人看法。

就向大家看見的這樣,由于多說服務器的原因,路楊正在逐步把 多說的評論寫回本地 Movable Type 的數據庫。

過程不算難。通過 API 獲得 JSON 數據,分析後寫入MT評論數據庫罷了。 為了區分和拓展,給 MT 數據庫的評論表增加了3行,分别記錄 遠程服務器名(remote_service),遠程服務器ID (remote_id) 和 UA ( agent)。

mt_db_table_comment.png

開始直接 Perl 腳本。核心代碼為

[模闆]MT下最簡單的實現CSS壓縮的辦法 ,

MT下最簡單的實現CSS壓縮(優化)的辦法

大家都知道。 CSS壓縮可以給網站訪問提速, 這個也是 Google Yahoo 等大網站對于網站優化提出的标注之一。
但是,CSS壓縮對于網站開發者來說,也意味着可讀性降低,也意味着需要保留兩份代碼,一份正常的可讀性高的,一份壓縮的的供網站使用。
對于業餘站長,壓縮CSS是個可愛又可恨的東西,需要第3方工具來完成。
其實,對于 MT 程序來說,利用一點點模闆變通可以實現 CSS的自動壓縮。
簡單的來說就是利用 MT 模闆 Tag 自身的幾個全局過濾函數的過濾/替換功能:

  1. strip_linefeeds
    strip_linefeeds 很好理解,就是把Tag内所有的換行去掉,讓他變成一行。 使用辦法 <$MT:tag strip_linefeeds="1" $>

  2. strip
    strip 過濾則是用特定字符替換掉 Tag 内的就空白(1個或者多個連續空格),比如我要把這些空白替換成一個空格則是用 <$MT:tag strip=" " $>

  3. 正則方式regex_replace=["正則表達式匹配部分","要替換成的内容"]
    這是最強大的功能,我們用它來替換掉原始CSS 的注釋部分。 當然為了表達式簡單,我隻替換/*[注釋内容]*/ 方式,而不處理 //[注釋内容] 樣式,這個就需要你的原始CSS 的注釋必須是 /*[注釋内容]*/ 方式,而不是 //[注釋内容],但是修改所有的 //[注釋内容]/*[注釋内容]*/ 并不是太繁瑣的事情。如果要處理 //[注釋内容]方式,必須在 strip_linefeeds 之前使用。我的使用辦法 <$MT:tag regex_replace="/\/\*.+?\*\//g","" $>
    注意,正則表達式兼容 Perl 正則,但是隻識别 /../模式。

  4. trim
    trim 很好理解,就是把Tag内開頭和結尾的空白去掉。 使用辦法 <$MT:tag trim="1" $>

[MT Hack]修改模闆來完成MT的AJAX提交評論 ,

曾經,本站在MT3時代,曾經寫過以AJAX提交評論預覽 的帖子。

那個也是通過修改模闆+自寫js實現,沒有對MT的源代碼進行任何修改,綠色無污染,不影響升級。

後來,通過自己摸索,也實現了 ajax 方式提交評論。但是一直都沒有寫出教程,今天有點時間。特意寫出分享之。

具體效果見本站評論提交(預覽和發表)。

言歸正傳,要實現 ajax 方式首先要定義一系列 js 函數。 由于 本站已經遷移到了 JQuery 平台,所以在改寫 mt.js 需要先加入 JQ 支持,即加入:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>

[SiteLog]升級MT到5.2.13,記錄下對一些pm的修改 ,

升級MT到5.2.13。

記錄下對一些 pm 的修改,方便以後覆蓋升級。


1. /lib/MT/Template/ContextHandlers.pm :

修改位置: sub _math_operation
代碼:

    ##分頁 By easunlee#
   elsif ( ( 'pages' eq $op ) || ( 'paging' eq $op ) ) {
        return $ctx->error( MT->translate('Division by zero.') )
            if $rvalue == 0;
        return  int( ($lvalue+$rvalue-1) / $rvalue) ;
    }

2. /lib/MT/Template/Tags/Comment.pm :

修改位置: sub _hdlr_comment_author_link
代碼:

    if ($cmntr) {
        $name = encode_html( remove_html( $cmntr->nickname ) )
            if $cmntr->nickname;
        if ( $cmntr->url && ($cmntr->url !~ /^QQ\|/ ) ){#EasunLee            
            return sprintf(
                qq(<a title="%s" href="%s"%s>%s</a>),
                encode_html( $cmntr->url ),
                encode_html( $cmntr->url ),
                $target, $name
            );
        }

修改位置: sub _hdlr_comment_author_identity
代碼:

    my $auth_type = $cmntr->auth_type;
   ....

    my $result
        = qq{<img title=\"$auth_type User\" src=\"$logo\" width=\"16\" height=\"16\" />}; #EasunLee

--EOF--

Movable Type 6.1.1 released

https://movabletype.org/news/2015/04/movable_type_611_released.html

We are pleased to inform you that Movable Type 6.1.1 has been shipped.

In Movable Type 6.1.1, we have not only resolved many cases submitted by our engineers as well as many of our valued community members, but also improving the Content Sync feature.

Improved feature: Content Sync (Movable Type Advanced)

The content sync feature is now improved with user feedback. This change improves the stability and speed of processing and improves convenience.

To sync the difference between the previous version

In the previous version, Movable Type had been working to completely synchronize both the source and destination directories, so the processing time and the number of processed files increased and also extended proportionally. In addition, if you have to work with other systems in the destination server, unintended deletion of files may occur.

In the new version, it was changed to copy only the files and directories that have been added, updated and deleted from the previous processing result. By this change, processing speed and stability has been greatly improved. (First time only, all of the files may take some time to sync to the target.)

To be able to set more than one schedule

If you want to make multiple synchronization schedules, now you can create or replicate existing settings without the effort of having to enter the information of the delivery destination every time.

Release notes

Please review the Movable Type release notes to see everything that was added and improved since the version you are currently using. Also review the known issues sections in case there are items of which you should be aware before upgrading.

Download

If you have an existing Movable Type 6 license, you can download the latest Movable Type from our download portal using your Six Apart ID.

To purchase a new license or an upgrade, please visit MovableType.com for more information, or feel free to contact us if you have any questions.

[SiteLog]終于迎來了原生的MT主頁/分類頁的分頁 ,

 This is a SiteLog for 。

   對于靜态發布的MT來說,主頁/分類頁 的分頁很不好實現。一直以來,要在主頁展示更多頁面的朋友們都是利用一個  插件PageArchives  來實現。對我來說,實現這個功能實在太繁瑣了點,也就懶得折騰。

今天,在測試MT5的新主題( Rainier 1.04)的時候,居然發現可以分頁了。

立即查看模闆,發現可以原生分頁,分頁由 mt-seach.cgi 完成。呃,又是這個 cgi ,看來資源大戶的名氣又要響亮一點了。

我的模闆是在一直 在 "Professional Blog" 上修改的。 不想再次重寫模闆了。 直接移植吧。

其實很簡單,要實現分頁,必須給 <mt:Entries> 加上 search_results 選項。

[Perl]本站使用的文本緩存Tag搜索的Perl腳本 ,

Movable Type 資源瓶頸基本上都是mt-search.cgi

不管是站内自定義搜索,還是按照Tags進行查詢,都調用的是這個腳本。

本站靈感來之 AnySQL 的文本緩存。 但是不同于 AnySQL 的一直是獨立的cgi文件進行緩存,配合.htaccess 和默認搜索慢闆完成

這次更新後台,這個獨立cgi腳本也做了小的邏輯修改。

特共享之,供有動手精神的同好自我完善。

代碼如下:

1   2   3   4