Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.

December 09 2015

16:18

網頁相關技術的抉擇

以往的網頁純粹就是 HTML,之後的動態網頁技術 ( CGIPHPASPJSP、… )、CSSVBScriptJavascript 雖讓網頁內容/效果愈來愈多元,網頁開發/維護難度的關鍵亦僅取決於語言的熟悉度。

近幾年則是冒出了不少網頁前端 frameworks。 node.jsio.jsReactAngularBackboneEmber、…,雖說是使用相同的程式語言,但各種 frameworks 的選用與導入著實讓不少網頁前端開發人員頭疼。

考量多螢、多裝置的兼容性, COSCOP 2015 就有人提出 “每18至24個月,前端技術的難度會增加一倍以上"。
但… 真只有網頁前端開發人員的日子愈來愈難熬嗎?
SQL InjectionXSSCORS 等議題與考量呢?

我個人一直認為程式語言只是工具,沒特別去吹捧某特定程式語言;同理,我也把 frameworks 當作是工具。
我們看到的一些新技術/framework 固然很好,真有立即導入的必要性嗎?
若看到新的技術屏除跟風心態,先稍作觀望,讓環境的變化幫我們除強汰弱,另一方面加強人員的教育訓練,新技術導入前仔細評估,審慎抉擇,是否網頁開發人員就可以不必過得如此辛苦?

<!-- /themify_builder_content -->

August 25 2015

14:39

調整 Apache HTTPD & Apache Tomcat & nginx 的 content cache & compression

前陣子調整了一些 Apache HTTPD & Tomcat & nginx 的 cache 機制與內容壓縮機制,稍微紀錄一下。

Apache HTTPD 的 cache:

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType image/gif "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType text/css "access plus 1 month"
</IfModule>

Apache HTTPD 的壓縮:

<IfModule mod_deflate.c>
  DeflateCompressionLevel 9
  AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php
  AddOutputFilter DEFLATE js css
</IfModule>

Tomcat 的 cache(在 application 的 web.xml 做調整):

  <filter>
    <filter-name>ExpiresFilter</filter-name>
    <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
    <init-param>
      <param-name>ExpiresByType image</param-name>
      <param-value>access plus 1 month</param-value>
    </init-param>
    <init-param>
      <param-name>ExpiresByType text/css</param-name>
      <param-value>access plus 1 month</param-value>
    </init-param>
    <init-param>
      <param-name>ExpiresByType application/javascript</param-name>
      <param-value>access plus 1 month</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>ExpiresFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

Tomcat 的壓縮(在 conf/server.xml 做調整):

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               compression="on" compressableMimeType="text/html,text/xml,text/plain,text/css,application/javascript"
               redirectPort="8443" />

nginx 的 cache(在 server tag 內做調整):

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 1M;
}

nginx 的壓縮(在 http tag 內做調整):

gzip_vary on;
gzip_proxied any;
gzip_comp_level 9;
gzip_buffers 8 32k;
gzip_http_version 1.0;
gzip_types text/plain text/css application/json
           application/javascript application/x-javascript text/javascript
           text/xml application/xml application/rss+xml application/atom+xml application/rdf+xml;

大概就調這些,其他多媒體檔案就看需求了...

<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Apache HTTPD, Apache Tomcat, cache, compression, deflate, gzip, nginx

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->

March 03 2015

18:14

勞保局的自然人憑證元件...

現在都什麼時候了... 是沒有人在用嗎? O_o

<!-- start wp-tags-to-technorati 1.02 --> <!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->
18:14

勞保局的自然人憑證元件...

現在都什麼時候了... 是沒有人在用嗎? O_o

<!-- start wp-tags-to-technorati 1.02 --> <!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->

December 30 2014

14:13

Crucial M550 on Lenovo L412

從數據看來,也是受限於界面速度,但 4k 對齊與 AHCI 設定等等的 tuning 影響頗大。

調整前:
Crucial M550 on L412-Before-MB
Crucial M550 on L412-Before-IO

調整後:
Crucial M550 on L412-After-MB
Crucial M550 on L412-After-IO

4k-64Thrd 的寫入差距頗大...

<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Crucial, L412, Lenovo, M550, SSD

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->
14:13

Crucial M550 on Lenovo L412

從數據看來,也是受限於界面速度,但 4k 對齊與 AHCI 設定等等的 tuning 影響頗大。

調整前:
Crucial M550 on L412-Before-MB
Crucial M550 on L412-Before-IO

調整後:
Crucial M550 on L412-After-MB
Crucial M550 on L412-After-IO

4k-64Thrd 的寫入差距頗大...

<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Crucial, L412, Lenovo, M550, SSD

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->

December 14 2014

12:27

rsyslog daemon 在 OpenVZ guest 瘋狂佔用 CPU resource

剛幫忙解掉的問題。
某台建立在 OpenVZUbuntu 的 rsyslog daemon process 瘋狂佔用 CPU resource。
log 看到的狀況是這樣:

...
Dec 14 06:25:13 Linux rsyslogd-2177: rsyslogd[internal_messages]: 1134916 messages lost due to rate-limiting
Dec 14 06:25:13 Linux rsyslogd: imklog: error reading kernel log - shutting down: Bad file descriptor
Dec 14 06:25:13 Linux rsyslogd: message repeated 498 times: [imklog: error reading kernel log - shutting down: Bad file descriptor]
Dec 14 06:25:19 Linux rsyslogd-2177: rsyslogd[internal_messages]: 1114295 messages lost due to rate-limiting
Dec 14 06:25:19 Linux rsyslogd: imklog: error reading kernel log - shutting down: Bad file descriptor
Dec 14 06:25:19 Linux rsyslogd: message repeated 498 times: [imklog: error reading kernel log - shutting down: Bad file descriptor]
Dec 14 06:25:25 Linux rsyslogd-2177: rsyslogd[internal_messages]: 1805432 messages lost due to rate-limiting
Dec 14 06:25:25 Linux rsyslogd: imklog: error reading kernel log - shutting down: Bad file descriptor
Dec 14 06:25:25 Linux rsyslogd: message repeated 498 times: [imklog: error reading kernel log - shutting down: Bad file descriptor]
...

把 /etc/rsyslog.conf 下列這行註解掉,重新啟動 rsyslog 就搞定了... :-)

$ModLoad imklog   # provides kernel logging support
<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Linux, OpenVZ, rsyslog, Ubuntu

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->
12:27

rsyslog daemon 在 OpenVZ guest 瘋狂佔用 CPU resource

剛幫忙解掉的問題。
某台建立在 OpenVZUbuntu 的 rsyslog daemon process 瘋狂佔用 CPU resource。
log 看到的狀況是這樣:

...
Dec 14 06:25:13 Linux rsyslogd-2177: rsyslogd[internal_messages]: 1134916 messages lost due to rate-limiting
Dec 14 06:25:13 Linux rsyslogd: imklog: error reading kernel log - shutting down: Bad file descriptor
Dec 14 06:25:13 Linux rsyslogd: message repeated 498 times: [imklog: error reading kernel log - shutting down: Bad file descriptor]
Dec 14 06:25:19 Linux rsyslogd-2177: rsyslogd[internal_messages]: 1114295 messages lost due to rate-limiting
Dec 14 06:25:19 Linux rsyslogd: imklog: error reading kernel log - shutting down: Bad file descriptor
Dec 14 06:25:19 Linux rsyslogd: message repeated 498 times: [imklog: error reading kernel log - shutting down: Bad file descriptor]
Dec 14 06:25:25 Linux rsyslogd-2177: rsyslogd[internal_messages]: 1805432 messages lost due to rate-limiting
Dec 14 06:25:25 Linux rsyslogd: imklog: error reading kernel log - shutting down: Bad file descriptor
Dec 14 06:25:25 Linux rsyslogd: message repeated 498 times: [imklog: error reading kernel log - shutting down: Bad file descriptor]
...

把 /etc/rsyslog.conf 下列這行註解掉,重新啟動 rsyslog 就搞定了... :-)

$ModLoad imklog   # provides kernel logging support
<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Linux, OpenVZ, rsyslog, Ubuntu

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->

November 29 2014

19:05

[MySQL] shrink ibdata file

最近幫忙處理某台 MySQL 5.0 server,做了個小實驗,寫個文章把處理過程紀錄下來。

因為該 server 沒有 innodb_file_per_table 這個設定,所有的 InnoDB 資料都放在 ibdata 這個檔案裡,而我們希望能讓該 server 持續運作,盡可能在不停機的狀況下,把 InnoDB 的資料切開。

實驗後,我們透過這些步驟完成切割/轉移:

  1. 確認舊的 server 有開啟 binlog,準備跑 replication。
  2. Percona XtraBackup 備份舊的 MySQL 資料庫。
  3. 準備新機器,把備份檔丟到新的 server。
  4. 在新機器的 my.cnf 加入 innodb_file_per_table 設定,把 MySQL daemon 跑起來。
  5. 在新機器用以下指令把 InnoDB table 挑出來:
    SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `TABLES` WHERE `ENGINE`='InnoDB' ORDER BY `TABLE_SCHEMA`,`TABLE_NAME`;
  6. 在新機器用 mysqldump 匯出 table schema & data :
    mysqldump -u root -pMY_PASSWORD --max_allowed_packet=512M -Cx --opt TABLE_SCHEMA TABLE_NAME > TMP_DIR/TABLE_SCHEMA.TABLE_NAME.sql
  7. 在新機器 drop 掉已匯出的 table:
    DROP TABLE `TABLE_SCHEMA`.`TABLE_NAME`;
  8. 停掉新機器的 MySQL daemon,把 datadir 的 ib* 搬走,再啟動 MySQL daemon。
  9. 重新匯入 table:
    mysql -u root -pMY_PASSWORD TABLE_SCHEMA < TMP_DIR/TABLE_SCHEMA.TABLE_NAME.sql
  10. CHANGE MASTER TO ... 指令開始讓新機器的 MySQL 成為舊 server 的 SLAVE。
  11. 同步完成後,找時間讓舊的 server 退下,讓新的 server 佔用舊機器的 IP。
  12. 在新機器的 MySQL 執行 RESET SLAVE,停掉 replication。
<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: ibdata, innodb_file_per_table, MySQL, mysqldump, shrink, XtraBackup

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->
19:05

[MySQL] shrink ibdata file

最近幫忙處理某台 MySQL 5.0 server,做了個小實驗,寫個文章把處理過程紀錄下來。

因為該 server 沒有 innodb_file_per_table 這個設定,所有的 InnoDB 資料都放在 ibdata 這個檔案裡,而我們希望能讓該 server 持續運作,盡可能在不停機的狀況下,把 InnoDB 的資料切開。

實驗後,我們透過這些步驟完成切割/轉移:

  1. 確認舊的 server 有開啟 binlog,準備跑 replication。
  2. Percona XtraBackup 備份舊的 MySQL 資料庫。
  3. 準備新機器,把備份檔丟到新的 server。
  4. 在新機器的 my.cnf 加入 innodb_file_per_table 設定,把 MySQL daemon 跑起來。
  5. 在新機器用以下指令把 InnoDB table 挑出來:
    SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `TABLES` WHERE `ENGINE`='InnoDB' ORDER BY `TABLE_SCHEMA`,`TABLE_NAME`;
  6. 在新機器用 mysqldump 匯出 table schema & data :
    mysqldump -u root -pMY_PASSWORD --max_allowed_packet=512M -Cx --opt TABLE_SCHEMA TABLE_NAME > TMP_DIR/TABLE_SCHEMA.TABLE_NAME.sql
  7. 在新機器 drop 掉已匯出的 table:
    DROP TABLE `TABLE_SCHEMA`.`TABLE_NAME`;
  8. 停掉新機器的 MySQL daemon,把 datadir 的 ib* 搬走,再啟動 MySQL daemon。
  9. 重新匯入 table:
    mysql -u root -pMY_PASSWORD TABLE_SCHEMA < TMP_DIR/TABLE_SCHEMA.TABLE_NAME.sql
  10. CHANGE MASTER TO ... 指令開始讓新機器的 MySQL 成為舊 server 的 SLAVE。
  11. 同步完成後,找時間讓舊的 server 退下,讓新的 server 佔用舊機器的 IP。
  12. 在新機器的 MySQL 執行 RESET SLAVE,停掉 replication。
<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: ibdata, innodb_file_per_table, MySQL, mysqldump, shrink, XtraBackup

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->

July 10 2014

15:52

[PHP] 自製金錢分攤函式

近日在工作上應該會需要計算金錢分攤,簡單寫了個 PHP 函式備用。

function shareAmount( $amount , $shares ) {
        $arr = array();
        if ( is_numeric($amount) && is_int($shares) ) {
                $precision = is_int($amount) ? 0 : strlen(substr($amount, strpos($amount, '.')+1));
                for ( $i = $shares; $i > 0; $i-- ) {
                        $val = round( $amount / $i , $precision );
                        array_push( $arr , $val );
                        $amount -= $val;
                }
        }
        return $arr;
}

執行結果大概像這樣:

// var_dump( shareAmount(101,3) );
array(3) {
  [0]=>
  float(34)
  [1]=>
  float(34)
  [2]=>
  float(33)
}

// var_dump( shareAmount(0.5101,3) );
array(3) {
  [0]=>
  float(0.17)
  [1]=>
  float(0.1701)
  [2]=>
  float(0.17)
}

我在資料庫沒看到大數,所以就沒考慮 BC Math,直接用 is_numeric() 了... :p

<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: PHP

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->
15:52

[PHP] 自製金錢分攤函式

近日在工作上應該會需要計算金錢分攤,簡單寫了個 PHP 函式備用。

function shareAmount( $amount , $shares ) {
        $arr = array();
        if ( is_numeric($amount) && is_int($shares) ) {
                $precision = is_int($amount) ? 0 : strlen(substr($amount, strpos($amount, '.')+1));
                for ( $i = $shares; $i > 0; $i-- ) {
                        $val = round( $amount / $i , $precision );
                        array_push( $arr , $val );
                        $amount -= $val;
                }
        }
        return $arr;
}

執行結果大概像這樣:

// var_dump( shareAmount(101,3) );
array(3) {
  [0]=>
  float(34)
  [1]=>
  float(34)
  [2]=>
  float(33)
}

// var_dump( shareAmount(0.5101,3) );
array(3) {
  [0]=>
  float(0.17)
  [1]=>
  float(0.1701)
  [2]=>
  float(0.17)
}

我在資料庫沒看到大數,所以就沒考慮 BC Math,直接用 is_numeric() 了... :p

<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: PHP

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->

May 04 2014

14:12

Javascript 的變數範圍

最近在微調部門某個 PHP 專案程式,該專案使用 ExtJS 作前端介面 framework ...
整理這個專案內的 Javascript 程式讓我覺得... 應該有不少人忽略,或是不在意 Javascript 的變數定義方式。

先來看這串程式碼:
Javascript variable scope (test code)
執行結果:
Javascript variable scope (test result)

這張圖有趣就在第 40, 41 行程式碼執行的結果差異,以及 42, 43 行程式碼執行的結果差異。
在 Javascript 不透過 var 進行定義之變數,皆為全域變數;但透過 var 定義之變數就有變數範圍。
這兩種變數定義方式影響瀏覽器開啟網頁後的記憶體耗用量,以及 Javascript engine 進行 GC 的效率與結果,不得不慎呀...

<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Garbage collection, GC, Javascript, variable scope

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->
14:12

Javascript 的變數範圍

最近在微調部門某個 PHP 專案程式,該專案使用 ExtJS 作前端介面 framework ...
整理這個專案內的 Javascript 程式讓我覺得... 應該有不少人忽略,或是不在意 Javascript 的變數定義方式。

先來看這串程式碼:
Javascript variable scope (test code)
執行結果:
Javascript variable scope (test result)

這張圖有趣就在第 40, 41 行程式碼執行的結果差異,以及 42, 43 行程式碼執行的結果差異。
在 Javascript 不透過 var 進行定義之變數,皆為全域變數;但透過 var 定義之變數就有變數範圍。
這兩種變數定義方式影響瀏覽器開啟網頁後的記憶體耗用量,以及 Javascript engine 進行 GC 的效率與結果,不得不慎呀...

<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Garbage collection, GC, Javascript, variable scope

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->

March 03 2014

17:20

Sencha Touch 使用心得

這陣子在進行一個 mobile web 開發專案;我們對 Ext JS 還算熟悉,故選擇採用同公司的產品:Sencha Touch
我們沒使用過,決定先進行 prototyping,看能挖出多少可用、好用的元件。
目前第一版趨近完成,我先寫篇心得分享,順道幫自己留個筆記;請路過看到的前輩、高手們不吝給予指教啦~ (羞)

目前是 2014 年 3 月初,已釋出的 Sencha Touch 最新 GPL 版本是 2.3.1,但堪用的是 2.1.1。
Sencha Touch 僅支援 WebKit based 網頁瀏覽器,大致上就是這些

我們遭遇到最詭異的就是 Ext.field.DatePicker 元件;在 2.3.1 版,Android device 的 Chrome、Opera、系統內建瀏覽器,以及 iOS devices 的 Safari,點選日期文字後應呈現的日期滾輪都會消失。

Sencha Touch 2.3.1 : Ext.field.DatePicker in Chrome Sencha Touch 2.3.1 : Ext.field.DatePicker in Opera Chrome on Android Opera on Android

改用 Gecko-based 的 Firefox 瀏覽網頁,滾輪反而跑出來了... :-|
Sencha Touch 2.3.1 : Ext.field.DatePicker in Firefox
但元件的外觀的確與 WebKit-based 的瀏覽器不太一樣。

用電腦版的 Chrome 開啟 Sencha Touch 2.3.1 的 Ext.field.DatePicker 文件頁面,頁面內的 Live Preview 完全看不見元件蹤影;我們進行降版測試,歷經 2.3.0、2.2.1、2.2.0,直到 2.1.1 才得到可用的元件,用電腦版的 Chrome 開啟 Sencha Touch 2.1.1 的 Ext.field.DatePicker 文件頁面也的確可以在 Live Preview 看到元件。
附帶一提,目前該元件仍無法透過元件初始設定變更滾輪的內容,月份滾輪只有 January、February、... 可用。

繼詭異的 Ext.field.DatePicker 之後,我們發現... 沒有挑選時間用的滾輪元件(TimePicker?)。 (驚)
後來我們用 Ext.field.TextExt.picker.Picker 組出挑選時間用的滾輪元件。

看到這裡,可能有人會覺得「既然 Ext.field.DatePicker 很詭異,那也自己組就好」... 這我們也想過,但官方提供的 Ext.field.DatePicker 把每個月的最後一天處理的很好(沒有 2/30、4/31、... 這種組合可以選),可以省去很多麻煩事。 (眨眼)

另外,Ext.Msg 也是頗有問題。執行以下語法呈現的訊息視窗,再度呼叫時,視窗內的文字會完全消失:

  • Ext.Msg.alert('Title', 'Content', Ext.emptyFn);
  • Ext.Msg.prompt('Title', 'Question:', function(text) { /* ... */ });
  • Ext.Msg.confirm('Title', 'Question', Ext.emptyFn);

最後我們選擇使用 Ext.MessageBox 處理:

var confirmBox = Ext.create('Ext.MessageBox', {
	title: 'Title',
	html: 'Question',
	buttons: [{
		itemId: 'cancel',
		text: 'Cancel',
		handler: function() {
			confirmBox.hide();
		}
	},{
		itemId: 'ok',
		text: 'Send',
		ui: 'action',
		handler: function() {
			confirmBox.hide();
		}
	}]
});
confirmBox.show();

以上大概就是我們目前遭遇的問題與解決方式,以後踩到新地雷再撰文補上。 XD

<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Ext.field.DatePicker, Ext.MessageBox, Ext.Msg, Sencha Touch

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->
17:20

Sencha Touch 使用心得

這陣子在進行一個 mobile web 開發專案;我們對 Ext JS 還算熟悉,故選擇採用同公司的產品:Sencha Touch
我們沒使用過,決定先進行 prototyping,看能挖出多少可用、好用的元件。
目前第一版趨近完成,我先寫篇心得分享,順道幫自己留個筆記;請路過看到的前輩、高手們不吝給予指教啦~ (羞)

目前是 2014 年 3 月初,已釋出的 Sencha Touch 最新 GPL 版本是 2.3.1,但堪用的是 2.1.1。
Sencha Touch 僅支援 WebKit based 網頁瀏覽器,大致上就是這些

我們遭遇到最詭異的就是 Ext.field.DatePicker 元件;在 2.3.1 版,Android device 的 Chrome、Opera、系統內建瀏覽器,以及 iOS devices 的 Safari,點選日期文字後應呈現的日期滾輪都會消失。

Sencha Touch 2.3.1 : Ext.field.DatePicker in Chrome Sencha Touch 2.3.1 : Ext.field.DatePicker in Opera Chrome on Android Opera on Android

改用 Gecko-based 的 Firefox 瀏覽網頁,滾輪反而跑出來了... :-|
Sencha Touch 2.3.1 : Ext.field.DatePicker in Firefox
但元件的外觀的確與 WebKit-based 的瀏覽器不太一樣。

用電腦版的 Chrome 開啟 Sencha Touch 2.3.1 的 Ext.field.DatePicker 文件頁面,頁面內的 Live Preview 完全看不見元件蹤影;我們進行降版測試,歷經 2.3.0、2.2.1、2.2.0,直到 2.1.1 才得到可用的元件,用電腦版的 Chrome 開啟 Sencha Touch 2.1.1 的 Ext.field.DatePicker 文件頁面也的確可以在 Live Preview 看到元件。
附帶一提,目前該元件仍無法透過元件初始設定變更滾輪的內容,月份滾輪只有 January、February、... 可用。

繼詭異的 Ext.field.DatePicker 之後,我們發現... 沒有挑選時間用的滾輪元件(TimePicker?)。 (驚)
後來我們用 Ext.field.TextExt.picker.Picker 組出挑選時間用的滾輪元件。

看到這裡,可能有人會覺得「既然 Ext.field.DatePicker 很詭異,那也自己組就好」... 這我們也想過,但官方提供的 Ext.field.DatePicker 把每個月的最後一天處理的很好(沒有 2/30、4/31、... 這種組合可以選),可以省去很多麻煩事。 (眨眼)

另外,Ext.Msg 也是頗有問題。執行以下語法呈現的訊息視窗,再度呼叫時,視窗內的文字會完全消失:

  • Ext.Msg.alert('Title', 'Content', Ext.emptyFn);
  • Ext.Msg.prompt('Title', 'Question:', function(text) { /* ... */ });
  • Ext.Msg.confirm('Title', 'Question', Ext.emptyFn);

最後我們選擇使用 Ext.MessageBox 處理:

var confirmBox = Ext.create('Ext.MessageBox', {
	title: 'Title',
	html: 'Question',
	buttons: [{
		itemId: 'cancel',
		text: 'Cancel',
		handler: function() {
			confirmBox.hide();
		}
	},{
		itemId: 'ok',
		text: 'Send',
		ui: 'action',
		handler: function() {
			confirmBox.hide();
		}
	}]
});
confirmBox.show();

以上大概就是我們目前遭遇的問題與解決方式,以後踩到新地雷再撰文補上。 XD

<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Ext.field.DatePicker, Ext.MessageBox, Ext.Msg, Sencha Touch

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->

February 21 2014

17:06

[Apache Tomcat] Enhance security

我沒有在使用 Apache Tomcat 的後台,佈署軟體/程式都是透過 scp/sftp/ftp 等方式做傳輸。
所以在解開 Apache Tomcat 的壓縮檔之後,我會執行以下指令,把不必要的檔案清掉,增強安全性:

cd apache-tomcat-* && \
/bin/rm -rf webapps/docs webapps/examples webapps/host-manager webapps/manager && \
/bin/rm -f webapps/ROOT/*.gif webapps/ROOT/*.xml webapps/ROOT/*.ico webapps/ROOT/*.txt webapps/ROOT/*.svg && \
/bin/cat /dev/null > webapps/ROOT/index.jsp &&
/bin/cat /dev/null > webapps/ROOT/index.html
<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Apache Tomcat, security

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->
17:06

[Apache Tomcat] Enhance security

我沒有在使用 Apache Tomcat 的後台,佈署軟體/程式都是透過 scp/sftp/ftp 等方式做傳輸。
所以在解開 Apache Tomcat 的壓縮檔之後,我會執行以下指令,把不必要的檔案清掉,增強安全性:

cd apache-tomcat-* && \
/bin/rm -rf webapps/docs webapps/examples webapps/host-manager webapps/manager && \
/bin/rm -f webapps/ROOT/*.gif webapps/ROOT/*.xml webapps/ROOT/*.ico webapps/ROOT/*.txt webapps/ROOT/*.svg && \
/bin/cat /dev/null > webapps/ROOT/index.jsp &&
/bin/cat /dev/null > webapps/ROOT/index.html

Technorati Tags: Apache Tomcat, security

February 14 2014

13:53

[實測] Plextor M5M 256GB mSATA SSD (PX-256M5M) on Lenovo T420s

前幾天幫我在家用的 Lenovo T420s 裝上新的 mSATA SSD,用 AS SSD Benchmark 跑了些數據,貼在這裡做個紀錄。

受限於 T420s 的介面速度,Plextor M5M 256GB mSATA SSD 的效能沒有完全發揮。
PX-256M5M benchmarkPX-256M5M I/O

對照組,T420s 原廠給的 7mm 2.5" 7200rpm HDD。
HTS723232A7A364 benchmarkHTS723232A7A364 I/O

雖然 SSD 的效能沒有完全發揮,用來當系統碟的爽度依然很高啊... 8-)

<!-- start wp-tags-to-technorati 1.02 -->

Technorati Tags: Lenovo, M5M, mSATA, Plextor, SSD, T420s

<!-- end wp-tags-to-technorati -->
<!-- /themify_builder_content -->
13:53

[實測] Plextor M5M 256GB mSATA SSD (PX-256M5M) on Lenovo T420s

前幾天幫我在家用的 Lenovo T420s 裝上新的 mSATA SSD,用 AS SSD Benchmark 跑了些數據,貼在這裡做個紀錄。

受限於 T420s 的介面速度,Plextor M5M 256GB mSATA SSD 的效能沒有完全發揮。
PX-256M5M benchmarkPX-256M5M I/O

對照組,T420s 原廠給的 7mm 2.5" 7200rpm HDD。
HTS723232A7A364 benchmarkHTS723232A7A364 I/O

雖然 SSD 的效能沒有完全發揮,用來當系統碟的爽度依然很高啊... 8-)

Technorati Tags: Lenovo, M5M, mSATA, Plextor, SSD, T420s

Older posts are this way If this message doesn't go away, click anywhere on the page to continue loading posts.
Could not load more posts
Maybe Soup is currently being updated? I'll try again automatically in a few seconds...
Just a second, loading more posts...
You've reached the end.

Don't be the product, buy the product!

Schweinderl