2011年12月29日

解決 Tomcat Server in Eclipse unable to start within 45 seconds 啟動過久的錯誤


錯誤訊息如下:
Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.

紅色部份因人而異,而 45 秒是預設的設定,
發生這個錯誤時大概就是 project 還什麼的 load 太久,
以致於 Server 啟動花了太久的時間 Timeout 了。

解決方法是什麼呢?
如果確定 project 和 server 等設定都正確,
只是因為 load 太久而發生錯誤的話,
最簡單的方法當然就是要延長 timeout 的時間囉。


如上面圖示:
請在 Eclipse 下方 console 那一排的 tag 中找到 Servers,
對你的 Server 連點兩下,這時會出現上方的視窗,
在右上角處點開 timeout 的設定,改成你覺得 ok 的時間,
接著儲存設定再去重開 Server 即可囉!
若還是開不起來,就繼續把時間拉長吧~

關鍵字:Tomcat, Server, Eclipse, unable to start within 45 seconds,  server editor
參考資料:

2011年12月25日

Java Timer:schedule和scheduleAtFixedRate有何不同


在前一篇文章 Java Timer:排程、定時、週期性執行工作任務 中,
我們展示了如何利用 Timer 非常簡單地執行排程工作。
然而在 Timer 中有兩個用來排程的 method:schedule 和 scheduleAtFixedRate,
兩者最明顯的差異就是字面上的不同,後者多了 AtFixedRate,
可是在上一篇我們用 schedule 也可以重複執行工作啊?
到底這兩者差在哪裡呢?使用時機又該如何決定呢?
圖片來源:http://jeequ.com/12016/

為了解決這個問題,我直接查了 Timer 的 source code,
其中最關鍵的差異為:
  1. schedule為「fixed-delay」,執行時間參照前次工作執行完成的時間:
    若執行工作沒被 delay,則按照預訂的時間執行;但若執行工作時被 delay了,
    随後工作的預訂執行時間會按照上一次執行「完成」的時間點來計算
  2. scheduleAtFixedRate為「fixed-rate」,執行時間參照一開始的時間點;
    和schedule一樣,若執行工作沒被 delay,則按照預訂的時間執行;
    但如果執行工作時被delay了,
    後續的預訂執行時間仍按照上一次執行「開始」的時間點計算,
    為了「catch up」預訂時間,會連續多次補足未完成的任務
另外在在單次執行的情況下,
只要預訂要執行的時間已經過了,那麼兩者都會直接把工作移除不執行。
但若在有設定 period 的情況下,若預訂要執行的時間已經過了,
基於上面所描述的行為,schedule 沒有上次執行完成的時間,會從現在開始算並執行,
而 scheduleAtFixedRate 則以預訂執行的時間開始算,且會一口氣將過去未做的補上!

接著讓我們來看例子,首先我們要看的是當執行所需時間比執行間隔長和短時,
兩者的運作會有何差異:
下面是工作 Task 的程式碼,每次進到工作時會 random 睡上 4~8秒才結束。
 1 package werdna1222coldcodes.blogspot.com.demo.timer;
 2 
 3 import java.util.*;
 4 
 5 public class DateTaskSleep4to8s extends TimerTask {
 6     public void run() {
 7         System.out.println("Task 預訂執行時間:" 
 8                 + new Date(this.scheduledExecutionTime()) 
 9                 + ", \n實際執行時間:" + new Date());
10         try {
11             int sleepSeconds = (int) (4 + Math.random()*4);
12             System.out.println(
13                 "Task going to sleep " + sleepSeconds + "s.");
14             Thread.sleep(sleepSeconds*1000);
15         }
16             catch(InterruptedException e) {
17         }
18     }
19 }
下面則是測試程式的程式碼,預訂的時間間隔為 5秒:
 1 package werdna1222coldcodes.blogspot.com.demo.timer;
 2 
 3 import java.util.*;
 4 
 5 public class TimerScheduleAndScheduleAtFixedRateDemo {
 6     public static void main(String[] args) {
 7 
 8         TimerScheduleAndScheduleAtFixedRateDemo timerDemo 
 9             = new TimerScheduleAndScheduleAtFixedRateDemo();
10         timerDemo.testSchedule();
11         timerDemo.testScheduleAtFixedRate();
12     }
13     
14     void testSchedule(){
15 
16         Timer timer = new Timer();
17         System.out.println("In testSchedule:" + new Date());
18         System.out.println("Delay:5秒, Period:5秒");
19         
20         // schedule(TimerTask task, long delay, long period)
21         timer.schedule(new DateTaskSleep4to8s(), new Date(), 5000);
22         
23         try {
24             Thread.sleep(30000);
25         }
26             catch(InterruptedException e) {
27         }
28 
29         timer.cancel();
30         System.out.println("End testSchedule:" + new Date() + "\n");
31     }
32     
33     void testScheduleAtFixedRate(){
34 
35         Timer timer = new Timer();
36         System.out.println("In testScheduleAtFixedRate:" + new Date()
37                            );
38         System.out.println("Delay:5秒, Period:5秒");
39         
40         // scheduleAtFixedRate(TimerTask task, long delay, long period)
41         timer.scheduleAtFixedRate(new DateTaskSleep4to8s(), new Date(),
42                                   5000);
43         
44         try {
45             Thread.sleep(30000);
46         }
47             catch(InterruptedException e) {
48         }
49 
50         timer.cancel();
51         System.out.println("End testScheduleAtFixedRate:" + new Date(
52                            ) + "\n");
53     }
54 }
執行結果:
首先來看 schedule 的部份,由下面的資料我們可以發現,
當工作執行時間超過 5 秒時,下次的預訂執行時間會以工作結束的時間來計算,
如下面標紅色部份,工作執行了 7秒,則下次的預訂時間就晚 7秒,
而若工作時間少於 5 秒,下次執行的間隔仍維持 5 秒,如下面標藍色部份。
對 schedule 而言,所有預訂和實際執行時間都是相同的,沒有 catch up 的情況。
In testSchedule:Sun Dec 25 14:56:31 CST 2011
Delay:5秒, Period:5秒
Task 預訂執行時間:Sun Dec 25 14:56:31 CST 2011, 
實際執行時間:Sun Dec 25 14:56:31 CST 2011
Task going to sleep 5s.
Task 預訂執行時間:Sun Dec 25 14:56:36 CST 2011, 
實際執行時間:Sun Dec 25 14:56:36 CST 2011
Task going to sleep 7s.
Task 預訂執行時間:Sun Dec 25 14:56:43 CST 2011, 
實際執行時間:Sun Dec 25 14:56:43 CST 2011
Task going to sleep 5s.
Task 預訂執行時間:Sun Dec 25 14:56:48 CST 2011, 
實際執行時間:Sun Dec 25 14:56:48 CST 2011
Task going to sleep 6s.
Task 預訂執行時間:Sun Dec 25 14:56:54 CST 2011, 
實際執行時間:Sun Dec 25 14:56:54 CST 2011
Task going to sleep 4s.
Task 預訂執行時間:Sun Dec 25 14:56:59 CST 2011, 
實際執行時間:Sun Dec 25 14:56:59 CST 2011
Task going to sleep 5s.
End testSchedule:Sun Dec 25 14:57:01 CST 2011
而對 scheduleAtFixedRate 來說,
當工作執行時間超過 5 秒時,下次的預訂執行時間仍以工作開始的時間來計算,
所以所有後續工作的預訂時間都是間隔 5秒,然而排程的工作不會同時執行
故雖然預訂時間間隔5秒,但實際執行時間會被 delay,如下面標紅色部份,
工作執行了 6秒,則下次的預訂時間是5秒後,但實際執行是6秒後。
這個預訂時間和實際執行時間的差距,將在後續的工作排程中產生影響,
在實際執行時間落後預訂時間時,scheduleAtFixedRate 會有 catch up 的機制,
在後續若執行時間較短,我們就可以發現執行的間距小於 5秒,如藍色所示。
In testScheduleAtFixedRate:Sun Dec 25 14:57:01 CST 2011
Delay:5秒, Period:5秒
Task 預訂執行時間:Sun Dec 25 14:57:01 CST 2011, 
實際執行時間:Sun Dec 25 14:57:01 CST 2011
Task going to sleep 6s.
Task 預訂執行時間:Sun Dec 25 14:57:06 CST 2011, 
實際執行時間:Sun Dec 25 14:57:07 CST 2011
Task going to sleep 5s.
Task 預訂執行時間:Sun Dec 25 14:57:11 CST 2011, 
實際執行時間:Sun Dec 25 14:57:12 CST 2011
Task going to sleep 5s.
Task 預訂執行時間:Sun Dec 25 14:57:16 CST 2011, 
實際執行時間:Sun Dec 25 14:57:17 CST 2011
Task going to sleep 6s.
Task 預訂執行時間:Sun Dec 25 14:57:21 CST 2011, 
實際執行時間:Sun Dec 25 14:57:23 CST 2011
Task going to sleep 4s.
Task 預訂執行時間:Sun Dec 25 14:57:26 CST 2011, 
實際執行時間:Sun Dec 25 14:57:27 CST 2011
Task going to sleep 6s.
End testScheduleAtFixedRate:Sun Dec 25 14:57:31 CST 2011
看完了以上的例子,我們發現 schedule 和 scheduleAtFixedRate都不會同時執行,
而是接續著執行,所以不須考慮同步的問題。
這點在 Timer的schedule和scheduleAtFixedRate方法的区别解析 的解釋是錯的,
因為他印出的都是 scheduledExecutionTime,而非實際執行時間。

接下來我們再來看看若預訂執行的時間已經過了,兩個不同 method 有何差異,
這也會展示 catch up 的影響到底有多大:
這次我們不再需要不同的工作時間,所以工作的程式碼簡化如下:
 1 package werdna1222coldcodes.blogspot.com.demo.timer;
 2 
 3 import java.util.*;
 4 
 5 public class DateTaskWithBothTime extends TimerTask {
 6     
 7     @ Override
 8     public void run() {
 9         System.out.println("Task 預訂執行時間:" 
10                 + new Date(this.scheduledExecutionTime()) 
11                 + ", \n實際執行時間:" + new Date());
12     }
13 }
而測試的程式碼如下:
 1 package werdna1222coldcodes.blogspot.com.demo.timer;
 2 
 3 import java.util.*;
 4 
 5 public class TimerScheduleAndScheduleAtFixedRateDemo {
 6     public static void main(String[] args) {
 7 
 8         TimerScheduleAndScheduleAtFixedRateDemo timerDemo 
 9             = new TimerScheduleAndScheduleAtFixedRateDemo();
10 
11         timerDemo.testSchedulePassedDate();
12         timerDemo.testScheduleAtFixedRatePassedDate();
13     }
14     
15     void testSchedulePassedDate(){
16 
17         Timer timer = new Timer();
18         System.out.println("In testSchedulePassedDate:" + new Date())
19                            ;
20         System.out.println("Period:5秒");
21         
22         // 設定填入schedule中的 Date firstTime 
23         為現在的15秒前
24         Calendar calendar = Calendar.getInstance();
25         calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND)-15)
26                      ;
27         Date firstTime = calendar.getTime();
28         
29         // 也可用 simpleDateFormat 直接設定 firstTime 
30         的精確時間
31         // SimpleDateFormat dateFormatter = 
32         //      new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");  
33         // Date firstTime = dateFormatter.parse("2011/12/25 13:30:00");
34         
35         // schedule(TimerTask task, Date firstTime, long period)
36         timer.schedule(new DateTaskWithBothTime(), firstTime, 5000);
37         
38         try {
39             Thread.sleep(30000);
40         }
41             catch(InterruptedException e) {
42         }
43 
44         timer.cancel();
45         System.out.println("End testSchedulePassedDate:" + new Date()
46                            + "\n");
47     }
48     
49     void testScheduleAtFixedRatePassedDate(){
50 
51         Timer timer = new Timer();
52         System.out.println("In testScheduleAtFixedRatePassedDate:" 
53                 + new Date());
54         System.out.println("Period:5秒");
55         
56         // 設定填入schedule中的 Date firstTime 
57         為現在的15秒前
58         Calendar calendar = Calendar.getInstance();
59         calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND)-15)
60                      ;
61         Date firstTime = calendar.getTime();
62         
63         // schedule(TimerTask task, Date firstTime, long period)
64         timer.scheduleAtFixedRate(new DateTaskWithBothTime(), 
65                                   firstTime, 5000);
66         
67         try {
68             Thread.sleep(30000);
69         }
70             catch(InterruptedException e) {
71         }
72 
73         timer.cancel();
74         System.out.println("End testScheduleAtFixedRatePassedDate:" 
75                 + new Date() + "\n");
76     }
77  }
執行的結果為:
In testSchedulePassedDate:Sun Dec 25 16:11:32 CST 2011
Period:5秒
Task 預訂執行時間:Sun Dec 25 16:11:32 CST 2011, 
實際執行時間:Sun Dec 25 16:11:32 CST 2011
Task 預訂執行時間:Sun Dec 25 16:11:37 CST 2011, 
實際執行時間:Sun Dec 25 16:11:37 CST 2011
Task 預訂執行時間:Sun Dec 25 16:11:42 CST 2011, 
實際執行時間:Sun Dec 25 16:11:42 CST 2011
Task 預訂執行時間:Sun Dec 25 16:11:47 CST 2011, 
實際執行時間:Sun Dec 25 16:11:47 CST 2011
Task 預訂執行時間:Sun Dec 25 16:11:52 CST 2011, 
實際執行時間:Sun Dec 25 16:11:52 CST 2011
Task 預訂執行時間:Sun Dec 25 16:11:57 CST 2011, 
實際執行時間:Sun Dec 25 16:11:57 CST 2011
End testSchedulePassedDate:Sun Dec 25 16:12:02 CST 2011

In testScheduleAtFixedRatePassedDate:Sun Dec 25 16:12:02 CST 2011
Period:5秒
Task 預訂執行時間:Sun Dec 25 16:11:47 CST 2011, 
實際執行時間:Sun Dec 25 16:12:02 CST 2011
Task 預訂執行時間:Sun Dec 25 16:11:52 CST 2011, 
實際執行時間:Sun Dec 25 16:12:02 CST 2011
Task 預訂執行時間:Sun Dec 25 16:11:57 CST 2011, 
實際執行時間:Sun Dec 25 16:12:02 CST 2011
Task 預訂執行時間:Sun Dec 25 16:12:02 CST 2011, 
實際執行時間:Sun Dec 25 16:12:02 CST 2011
Task 預訂執行時間:Sun Dec 25 16:12:07 CST 2011, 
實際執行時間:Sun Dec 25 16:12:07 CST 2011
Task 預訂執行時間:Sun Dec 25 16:12:12 CST 2011, 
實際執行時間:Sun Dec 25 16:12:12 CST 2011
Task 預訂執行時間:Sun Dec 25 16:12:17 CST 2011, 
實際執行時間:Sun Dec 25 16:12:17 CST 2011
Task 預訂執行時間:Sun Dec 25 16:12:22 CST 2011, 
實際執行時間:Sun Dec 25 16:12:22 CST 2011
Task 預訂執行時間:Sun Dec 25 16:12:27 CST 2011, 
實際執行時間:Sun Dec 25 16:12:27 CST 2011
Task 預訂執行時間:Sun Dec 25 16:12:32 CST 2011, 
實際執行時間:Sun Dec 25 16:12:32 CST 2011
End testScheduleAtFixedRatePassedDate:Sun Dec 25 16:12:32 CST 2011
由上面的結果我們可以發現當現在的時間已經超過指定的 date 時,
schedule 會直接從現在開始做,且沒有 catch up 的情況。
而 scheduleAtFixedRate 則會發生 catch up,即他會想要趕上預訂的執行時間,
所以已過期的任務仍會被執行,這也是為何藍色部份會在一開始被執行連續被執行。

從以上所有的測試結果來看,兩者主要的差異有兩點:
  1. 執行工作時間較預訂工作間隔長時:
    schedule 會直接 delay 後續的工作預訂的時間;
    scheduleAtFixedRate 後續工作的預訂時間仍按工作間隔計算,
    後續若有工作提早完成,會以 catch up 來追上預訂時間。
  2. 執行任務已過期時:
    若只執行單次不repeat,則兩者都不會執行;但若有 repeat,
    schedule 不會管前面過期的任務,直接由當下開始執行並計算後續的工作時間;
    scheduleAtFixedRate 則一樣以 catch up 機制,會先補足前面未完成的部份。
其他關於 Timer 的細節有興趣的人可以參考 Timer 的 source code:
http://kickjava.com/src/java/util/Timer.java.htm

若想知道更多有關 Java 時間相關的轉換、排程等應用,請見:
Java 時間日期處理範例大全:含時間單位格式轉換、期間計算、排程等

關鍵字:java, timer, schedule, scheduleAtFixedRate, 差異, 不同, 比較, 差別, example, 例子, 範例,
參考資料:

Java Timer:排程、定時、週期性執行工作任務


在我們寫程式的時候,常常會需要定期、延遲、排程執行任務,
這個需求可以很簡單地利用 Java 1.3 之後的 java.util.Timer 來達成。

Timer 中只有下列幾個 method 可以使用,
cancel 是指取消執行工作並終止 timer,purge則是移除所有工作,
至於 schedule 和 scheduleAtFixedRate 就是用來排程執行的 method,
大家可以先看看各 method 的說明:
Modifier and TypeMethod and Description
voidcancel()
Terminates this timer, discarding any currently scheduled tasks.
intpurge()
Removes all cancelled tasks from this timer's task queue.
voidschedule(TimerTask task, Date time)
Schedules the specified task for execution at the specified time.
voidschedule(TimerTask task, Date firstTime, long period)
Schedules the specified task for repeated fixed-delay execution, beginning at the specified time.
voidschedule(TimerTask task, long delay)
Schedules the specified task for execution after the specified delay.
voidschedule(TimerTask task, long delay, long period)
Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.
voidscheduleAtFixedRate(TimerTask task, Date firstTime, long period)
Schedules the specified task for repeated fixed-rate execution, beginning at the specified time.
voidscheduleAtFixedRate(TimerTask task, long delay, long period)
Schedules the specified task for repeated fixed-rate execution, beginning after the specified delay.
看完了說明後接下來我們就來demo一下 Timer 該怎麼用!
首先我們需要自行撰寫一個繼承了 TimerTask 的 class,
其中必須覆寫 run(),並在裡面填上我們要執行的工作,
在這個例子中我們只是簡單地印出工作被執行當下的時間。
 1 package werdna1222coldcodes.blogspot.com.demo.timer;
 2 
 3 import java.util.*;
 4 
 5 public class DateTask extends TimerTask {
 6     
 7     @ Override
 8     public void run() {
 9         System.out.println("Task 執行時間:" + new Date());
10     }
11 }
接著則是測試程式 TimerDemo,在這個程式中我們測試了三種 schedule的語法:
首先 testScheduleDelay 只測試在 delay 3秒後啟動工作,
testScheduleDelayAndPeriod 除了 delay 3秒外,每2秒會重複執行工作,
testScheduleDateAndPeriod 則將 delay 改為精確的時間,每10秒重複工作。
 1 package werdna1222coldcodes.blogspot.com.demo.timer;
 2 
 3 import java.util.*;
 4 
 5 public class TimerDemo {
 6     public static void main(String[] args) {
 7 
 8         TimerDemo timerDemo = new TimerDemo();
 9         timerDemo.testScheduleDelay();
10         timerDemo.testScheduleDelayAndPeriod();
11         timerDemo.testScheduleDateAndPeriod();
12     }
13     
14     void testScheduleDelay(){
15 
16         Timer timer = new Timer();
17         System.out.println("Delay:3秒");
18         System.out.println("In testScheduleDelay:" + new Date());
19 
20         // schedule(TimerTask task, long delay)
21         timer.schedule(new DateTask(), 3000);
22         
23         try {
24             Thread.sleep(10000);
25         }
26             catch(InterruptedException e) {
27         }
28 
29         timer.cancel();
30         System.out.println("End testScheduleDelay:" 
31             + new Date() + "\n");
32     }
33     
34     void testScheduleDelayAndPeriod(){
35 
36         Timer timer = new Timer();
37         System.out.println("Delay:3秒, Period:2秒");
38         System.out.println("In testScheduleDelayAndPeriod:" 
39             + new Date());
40         
41         // schedule(TimerTask task, long delay, long period)
42         timer.schedule(new DateTask(), 3000, 2000);
43         
44         try {
45             Thread.sleep(10000);
46         }
47             catch(InterruptedException e) {
48         }
49 
50         timer.cancel();
51         System.out.println("End testScheduleDelayAndPeriod:" 
52             + new Date() + "\n");
53     }
54     
55     void testScheduleDateAndPeriod(){
56 
57         Timer timer = new Timer();
58         
59         // 設定填入schedule中的 Date firstTime 
60         為現在的15秒後
61         Calendar calendar = Calendar.getInstance();
62         calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND)+15)
63                      ;
64         Date firstTime = calendar.getTime();
65         
66         // 也可用 simpleDateFormat 直接設定 firstTime 
67         的精確時間
68         // SimpleDateFormat dateFormatter = 
69         //      new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");  
70         // Date firstTime = dateFormatter.parse("2011/12/25 13:30:00");
71         
72         System.out.println("In testScheduleDateAndPeriod:" 
73             + new Date());
74         System.out.println("設定執行 Date 為15秒後:" 
75             + firstTime +", Period:10秒");
76                 
77         // schedule(TimerTask task, Date firstTime, long period)
78         timer.schedule(new DateTask(), firstTime, 10000);
79                 
80         try {
81             Thread.sleep(30000);
82         }
83             catch(InterruptedException e) {
84         }
85 
86         timer.cancel();
87         System.out.println("End testScheduleDateAndPeriod:" 
88             + new Date() + "\n");
89     }
90 }

執行結果:
Delay:3秒
In testScheduleDelay:Sun Dec 25 13:32:47 CST 2011
Task 執行時間:Sun Dec 25 13:32:50 CST 2011
End testScheduleDelay:Sun Dec 25 13:32:57 CST 2011

Delay:3秒, Period:2秒
In testScheduleDelayAndPeriod:Sun Dec 25 13:32:57 CST 2011
Task 執行時間:Sun Dec 25 13:33:00 CST 2011
Task 執行時間:Sun Dec 25 13:33:02 CST 2011
Task 執行時間:Sun Dec 25 13:33:04 CST 2011
Task 執行時間:Sun Dec 25 13:33:06 CST 2011
End testScheduleDelayAndPeriod:Sun Dec 25 13:33:07 CST 2011

In testScheduleDateAndPeriod:Sun Dec 25 13:33:07 CST 2011
設定執行 Date 為15秒後:Sun Dec 25 13:33:22 CST 2011, Period:10秒
Task 執行時間:Sun Dec 25 13:33:22 CST 2011
Task 執行時間:Sun Dec 25 13:33:32 CST 2011
End testScheduleDateAndPeriod:Sun Dec 25 13:33:37 CST 2011
雖然 demo 只有三種,但其實大家應該可以很容易理解四種 API 的使用方式:
  1. schedule(TimerTask task, Date time): 在特定時間單次執行
  2. schedule(TimerTask task, Date firstTime, long period) :在特定時間後重複執行
  3. schedule(TimerTask task, long delay): 在特定 delay 後單次執行
  4. schedule(TimerTask task, long delay, long period): 在特定 delay 後重複執行
至於 schedule 和 scheduleAtFixedRate 有何不同,請見:
Java Timer:schedule和scheduleAtFixedRate有何不同
若想知道更多有關 Java 時間相關的轉換、排程等應用,請見:
Java 時間日期處理範例大全:含時間單位格式轉換、期間計算、排程等

關鍵字:java, timer, schedule, example, 例子, 範例, cancel, 停止, 取消, delay
參考資料:

2011年12月24日

Tynt Insight:追蹤文章被複製的去向,並加上出處連結改善SEO


寫部落格最討厭的一件事就是自己辛辛苦苦分享的文章,
卻被別人簡單幾步驟就複製到他的網站上,
更機的是還沒有附上原始連結,
等於後續的曝光、轉貼都與原作者無關。
要是有人不明事理把盜取者當作是作者,
那對原作者而言還真是一則可悲又哀偒的笑話 orz。

基於這種狀況,有的作者會在網站上鎖右鍵、防複製的功能,
然而對我而言,網站上有很多程式碼教學分享,
若加上了防複製的功能,可能會影響到很多只是要複製程式碼學習的使用者。
所以今天就要來介紹 Tynt 這個網站,
該站在首頁上就列出了他的特點:
Improve your seo, keep users longer and measure your user engagement by leveraging the power of copy and paste.
簡而言之,他可以追蹤文章被網站讀者複製的動作,
並宣稱有增進改善 SEO(搜尋引擎最佳化) 的效果。
那麼他是如何作到的呢?

安裝該工具的方式很簡單,
首先先到網站上註冊,設定一些相關的參數後(通常都是預設即可),
再將所產生的 javascript 加到部落格或網站上,
這樣就安裝完畢囉。

安裝完後,只要網站上的文章被複製時,
這個工具會在被複製的文章段落後面加上一小段文字,
格式應該像這樣:「更多内容: 你的文章網址/#錨點」,
如「更多内容: http://werdna1222coldcodes.blogspot.com/2011/12/blog-plugins.html#ixzz1hS063rgz」,
其中紅色部份的更多内容: 是可以自訂的,預設好像是英文的 Read More:。
效果示意圖如下:


這樣的好處是可以在別人引用的文章中留下自己文章的原始連結,
當其他使用者點下網址時就會自動連到該篇被複製的文章,
(有其他介紹的文章還說會透過網址連回來時會將複製的內容反白起來,但我目前試不出來)。
當然啦,這是一種防君子不防小人的方式,
因為這種連結在貼上時轉貼者就看得到,若他要刪除,原作者也沒辦法。

上面這一段說明了文章被複製時會產生什麼效果,
更聰明的是這個網站還整理出報表,
可以讓你知道各文章的曝光度和被複製的次數,
似乎也可以知道在別人引用的文章裡,哪些又連回來你的網站造成更多的流量。
且透過這個工具,如果我們的網站內容常被引用,
網站的網址常常出現在別人的網站上,那麼我們的網站在搜尋引擎的排名將會大幅提升,
如此一來,除了從別人的網站上連回來,從搜尋引擎來的人也會變多喔!
流量一增加,除了能讓網站曝光,若有在網站上放上廣告服務,也能增加收益喔!
下面放張報表的截圖:

(2012.02.19更新)
在用了這個工具兩個月後,我決定將他從部落格中移除!
主要的原因在於號稱可大幅增加流量的功能似乎沒什麼效果,
反而是自己寫文章要複製自己的資料時常常被那些「更多內容:」給困擾,
回頭想想自己部落格分享了大量的程式碼,
那些「更多內容:」應該可對許多只是要取得程式碼的讀者造成麻煩。

既然增加流量沒有想像中的強大效果,
又會造成部落格讀者和作者本身的困擾,
所以最後就拿掉了這個工具。
附上兩個月後的流量報告,一個月只帶來40個 page view @@…

更多外掛如相關文章推薦輪播、部落格廣告賺錢、社群網站外掛等,請見總整理文章:
Blog Plugins:部落格外掛大全整理,什麼都有、什麼都不奇怪

關鍵字:SEO, 複製, 鎖右鍵, 追蹤, 原始連結, 出處, 流量
參考資料:

2011年12月22日

LinkWithin:用縮圖推薦相關文章、增加曝光率的外掛


上一篇介紹了 SimpleReach:為網站推薦熱門文章、增加曝光率的外掛
再更之前也介紹了:為Blogger加入Facebook建議(Recommendations)和最新動態(Activity Feed)外掛,推薦輪播熱門文章與互動
這些外掛都是用來推薦相關文章,增加使用者單次瀏覽量和曝光率。
更多外掛如相關文章推薦輪播、部落格廣告賺錢、社群網站外掛等,請見總整理文章:
Blog Plugins:部落格外掛大全整理,什麼都有、什麼都不奇怪

這篇也是要介紹這樣的外掛,這次的服務是「LinkWithin」,
這個網站部落格外掛可以用縮圖的方式為使用者推薦相關的文章,
藉此可以讓使用者在部落格停留更久,增加其他文章的曝光率。
這個外掛的效果如下:

LinkWithin 聽起來和先前介紹過的 SimpleReach 和 Facebook 外掛很像,
除了用縮圖來推薦外,還有什麼不同之處呢?
在先前的文章中提過,Facebook 外掛是利用社群的力量,
若朋友們或是很多不認識的人都對同一篇文章按讚,則使用者也會被吸引。
SimpleReach 則是利用使用者捲動頁面到下方時動態跑出來隨機推薦文章,
因為人對會動的東西比較有興趣,所以也會特別注意到他。

至於LinkWithin則是利用人們總是喜歡看圖片大於看文字,而且他還有個特點:
在寫網站或部落格時,我們常常引用自己先前的相關文章,
像這篇我就引用了先前的 SimpleReach 和 Facebook 外掛的文章,
LinkWithin 在推薦文章時會優先將我們在文章中有交叉連到的先前文章放上,
藉由文章中提及,最後又以圖片做輔助,一定可以增加連結過去閱讀的瀏覽量!

那麼LinkWithin到底要怎麼安裝呢?
以下我利用操作截圖和LinkWithin本身網站上的教學來說明:

第一步:連上LinkWithin網站,在右方填入相關資訊。

如果使用的不是 Blogger ,則會有對應的教學或直接列出 javascript 的程式碼。
只要將程式碼加到適當的位置即可。
(先別走開!若要更改Widget顯示的標題,請繼續往下看!)若和我一樣選擇的是 Blogger 平台,則會出現接下來的步驟引導:

Install Widget on Blogger

1. Click Install Widget to open Blogger in a new window, and follow the steps below in that window. Login to your Blogger account if necessary.
(Blogger使用者在點下Install Widget後會連到下面的頁面)
2. Select a blog if you have more than one, then click on Add Widget.
(修改適當的參數,基本上Blogger使用者在這一步可以直接按ADD或新增Widget就好)



3. (Optional) For better performance, Drag and Drop the LinkWithin box under the "Blog Posts" box.
(這步是說為了要有較好的效率,最好將程式區塊拉到文章的下方,可做可不做)



4. Click on Save.
(按儲存就完成啦!)


And you're done! The widget should now appear on your blog.
If there is a technical problem with the widget, visit our support page
NOTE: The quality of recommended stories will improve once we complete our crawl of your blog. This may take up to several hours, depending on the number of stories in your blog.
(相關的聯絡資訊和客服信箱)

在新增外掛後會需要一些時間來爬整個網站的文章,
大約過個十幾分鐘就開始會有文章出現,
但要到整個網站的外掛都正常運作可能要好幾個小時,
這段時間可能會沒有出現外掛的區塊、可能出現文字版的推薦,
最後才會出現像這樣子的效果:


在結束這篇文章之前,要來教大家怎麼更改這個外掛的標題,
目前外掛預設的標題好像是「You might also like:」,
若要把他改為自己想要的文字或改為中文,
可以在「var linkwithin_site_id = yourid;」後面加入這一行:
var linkwithin_text='你想改的文字';」,這樣就可以改標題囉!
目前我的外掛程式碼如下,大家也可以直接複製,只要記得改 id 就好!


更多外掛如相關文章推薦輪播、部落格廣告賺錢、社群網站外掛等,請見總整理文章:
Blog Plugins:部落格外掛大全整理,什麼都有、什麼都不奇怪

關鍵字:lenovo, 筆電, 安裝, win7, win, windows
參考資料:

SimpleReach:為網站推薦熱門文章、增加曝光率的外掛


更多外掛如相關文章推薦輪播、部落格廣告賺錢、社群網站外掛等,請見總整理文章:
Blog Plugins:部落格外掛大全整理,什麼都有、什麼都不奇怪

對於有持續在更新的部落格而言,
最新文章的流量的來源一種是來自於RSS、Atom等訂閱方式,
一種則是有忠誠的使用者且有定期來看的習慣。
而對部落格舊有的文章而言,
其主要的流量來源除了少數是由自己文章的交叉連結外,
其他大部份可能都是透過搜尋引擎或他人的引用連進來的。

然而,為了提升網站舊有文章的曝光率,
增加網站的瀏覽量、單次造訪頁數、平均網站停留時間等數據,
最好的方法就是想辦法吸引使用者的目光,
以相關的文章或使用者可能有興趣的熱門文章增加他們在網站停留的時間。

先前已經介紹過利用Facebook的外掛來推薦文章,
為Blogger加入Facebook建議(Recommendations)和最新動態(Activity Feed)外掛,推薦輪播熱門文章與互動,這是利用Facebook的社群功能,
也就是當使用者看到他的朋友們對某篇文章也有興趣時,
使用者就有可能被吸引而去點閱。
然而以我自己的經驗,因為我的朋友群在網站上的互動不夠多,
所以輪播推薦的效果並不大,常常看到推薦的都是同樣幾篇,
這樣並沒有辦法增加太多流量。
不過Facebook的這兩個外掛在網站有大量Facebook的讚、分享或留言時,
應該可以獲得很好的效果。

前情提要完畢,今天要介紹的是另一個部落格的外掛 SimpleReach
這個網站雖然是英文,但是基本的操作非常簡單易懂,
首先在使用前要先註冊,註冊畫面如下圖:
註冊畫面中的四個欄位都是必填,記得Website URL要填對,

點下Sign Up後到email信箱中點下連結開啟帳號功能,
接著就可以開始把外掛加入網站或部落格中了。


註冊後可在頁面右上方選擇 Manage,並在下面的網站右方選擇 Get Code:

目前SimpleReach支援了幾個常見的部落格平台如WordPress、Drupal、Blogger等,
直接選擇你對應該平台即可,若使用的平台不在上面,請選擇Other。

因為我使用的是Blogger,所以這邊還是先介紹Blogger的用法,
先到Blogger的「設計 - 範本」,右上角有「備份/還原」的選項。
進入後先將現在的範本備份下來,接著在上面的畫面中上傳到SimpleReach的網站,
完成後使可以在 SimpleReach 網站上下載修改後的範本,
再利用 Blogger 的範本還原功能將修改後的範本上傳上去,這樣就完成了!

如果使用的是其他不在支援列表的平台,則可以選擇Other,
複製上面的程式碼後加到部落格或網站的範本中即可,
因為Blogger也可以自己修改範本,所以如果你對修改範本有基本的了解,
其實也可以用這種方法修改。

將外掛加入網站後SimpleReach會開始對網站的文章做 index,
這需要一點時間,我裝了之後好像要等個10~20分鐘吧。
這時一樣可以到Manage的畫面看看Headlines的狀態,
如果有數字應該就是有成功了。
此時可以再到Report頁面,若impression已經有出現數字,
代表網站已經開始推薦文章了,而Clicks代表外掛連進網站其他文章的次數。

這個外掛在使用者捲動頁面到剩下約三分之一時會浮現在右下角,
效果如下:

到這邊為止我們就已經成功加入這個外掛了,
由上圖我們可以發現除了推薦文章的標題和連結外,
這個外掛也同時顯示出該篇文章在Facebook和Twitter被推薦的次數,
這樣一來藉由社群推薦的次數,相信也更能吸引使用者來點擊。

除了上面基本的功能外,這個外掛還有其他進階的設定,
例如style和options選項等,相關的設定說明都在:
http://simplereach.com/docs/publisher/slide_style
http://simplereach.com/docs/publisher/slide_options

這邊簡單說明我用所到的options選項和其他額外設定:
  1. slide_logo:
    這個選項讓我們可以設定在外掛的右下角要不要顯示 THE SLIDE 字眼,
    如果不想的話就將剛剛的程式碼加入 slide_logo: false 的設定。
  2. header:
    這個選項讓我們設定外掛左上角的標題,
    預設值是英文的「Recommended for you...」,
    這個選項也可支援HTML語法,所以也可以放入連結,
    注意放入連結時要加入 target='about_blank' 語法,
    不然開啟時只會在右下角的小框框中開啟 orz。
  3. 加入Google+1按鈕:(待補相關設定)
    外掛網站中有提到支援Google+1的按鈕,但實際使用時卻沒有出現,
    後來我在 http://www.thespicygadgematics.com/2011/11/how-to-add-simplereach-slide-to-blogger.html 和  [Plugin: SimpleReach Slide] google +1 這兩篇中找到一些討論,
    似乎在外掛的預設中沒有改入Google+1的按鈕,若想加入這個按鈕,
    還要另外寫信到 support@simplereach.com 請他們另外設定。
    我已經寄信去問了,之後若有成功設定我會再放上來。
    (2011.12.26更新)
    已經成功請他們另外設定Google+1 (Plus One)按鈕,
    的確是要寫信過去才能個別處理。往來信件如下:

    Hello,
    I'm using the javascript code of "other" platform and successfully put it in my blog templates of blogger.I've also changed some options of the plugin, such as plugin title.
    When I'm trying to get the google plus one button, I saw the instruction in  http://simplereach.com/docs/publisher/slide_style.
    The #simplereach-slide-footer is where The Slide logo and the social widgets go. The order of the social widgets from left to right if they are all enabled are: Google Plus One, Facebook Like, Twitter Share. To choose which sharing widgets The Slide should display, please go to the Manage Account section of the portal. 
    I think that if I want the original style, I can simply turn the google plus one option on in the protal. But I didn't see anything like that, would you please give me a guide or just give me a sample javascript code?
    My account is xxxx, and my website is http://werdna1222coldcodes.blogspot.com/.
    thanks.

    回信:
    I've added the Google +1 button to your Slide.  It could take up to 24 hours for that to propagate down through our servers.  If you don't see it by tomorrow, please let me know.  Thanks and please don't hesitate to let us know if there is anything else we can do.  Thanks and hope you had a great holiday.
加了 Google+1 按鈕和設定少許自訂選項後,我的 SimpleReach 效果如下:

而對應放在網站中的SimpleReach程式碼如下,
大家也可以直接複製使用,只要記得改自己的 pid 即可:

其他關於所有SimpleReach安裝的文件說明都在:
http://simplereach.com/docs/publisher/overview
若有問題可以去找找,找不到還可以寄信去問,相信大家都能找到適當的解答 :p

相關文章:
LinkWithin:用縮圖推薦相關文章、增加曝光率的外掛
更多外掛如相關文章推薦輪播、部落格廣告賺錢、社群網站外掛等,請見總整理文章:
Blog Plugins:部落格外掛大全整理,什麼都有、什麼都不奇怪

關鍵字:SimpleReach, Blogger, blogspot, google, google plus, google+1, blog, social, 部落格, 嵌, 外掛, plugin, Recommendations, Recommended for you..., 建議, 熱門文章, 推薦文章, 輪播, 功能, 模組, 加入, 教學,
參考資料:

2011年12月19日

部落格廣告賺錢術(二):博客來AP策略聯盟、Yahoo!奇摩購物中心大聯盟計畫平台、PChome商店街分紅網


用了部落格廣告三年多,最近開始重新寫這些廣告服務的介紹,
這系列的前一篇文章:
部落格廣告賺錢術(一):Google Adsense、BloggerAds、BlogAD 收益比較
介紹的是以點擊率和網站流量為收益計算基準的服務
今天這篇介紹的則是以實際購買行動為收益計算來源的服務,
一樣也介紹三家,分別是:
  1. 博客來AP策略聯盟
  2. Yahoo!奇摩購物中心 - 大聯盟計畫平台
  3. PChome 商店街分紅網
這些服務和前一篇中所介紹的廣告最不同之處是,
本篇所要介紹的這個類型的廣告一定要有消費產生才有會產生收益,
光點擊連結是無法產生收益的,
這也是為什麼這類廣告被稱為 CPA (Cost-per-Action) 的原因。
而 Google Adsense、BloggerAds 等以廣告出現頻率和使用者點擊廣告的次數來計算收益,
則被歸類於 PPC(Pay-per-Click) 每次點擊收益,
CPM(Cost per Thousand Impressions) 千次曝光收益。
有了這個基本認識後,我們開始進入正題!


博客來AP策略聯盟
博客來AP策略聯盟利用使用者由個人推薦連結進入購買商品的金額來計算分紅。
也就是說今天有人點了屬於我的推薦連結進入博客來購物,
那麼我就可以在這筆消費中取得固定比例的分紅。

至於到底怎麼樣消費才計入推薦者的分紅呢?以下引用官方部落格的說明:
問題:要怎麼判斷購買商品時,會被計算到回饋金?
回覆:請AP合作夥伴務必到管理後台取得已經嵌有您的AP帳號的活動連結,或是利用[銷售連結產生器]自行製作有嵌入AP帳號的網址連結,並將這些連結放到您的網站或部落格內,當使用者點選這些連結並被導引到博客來,完成交易後,就會把該次交易金額列入回饋金計算。您可以在購物車的標題列,看到該次交易所帶入的AP帳號,如下圖所示:您可以看到在瀏覽器標題列顯示的資訊包括[博客來會員購物車 日期 時間 AP帳號 微軟瀏覽器名稱],必須要有顯示AP帳號,該次交易的金額才有辦法列入計算


了解了怎麼計算分紅後,
在加入博客來AP策略聯盟前我們可以先到註冊頁面看看回饋比率,
然後選擇自己想要的合作方式:
回饋金計算比率表
商品類別獨家AP非獨家AP無回饋金AP
書籍4 %2 %0 %
雜誌2 %2 %0 %
影音2%1 %0 %
美妝2%0 %0 %
親子2 %0 %0 %
衣飾2 %0 %0 %
創意生活2 %0 %0 %
玩藝2 %0 %0 %
美食2 %0 %0 %

其中合作方案的規則是:
獨家AP
合作期間貴網站除了博客來之外,不放置其他電子商務網站相關的銷售連結
非獨家AP
合作期間貴網站放置包含博客來,以及其他電子商務網站相關的銷售連結
無回饋金AP
適用於學術單位或政府機關,或者決定不要回饋金者,博客來不提供回饋金

一開始看到回饋比率,大家當然都想用獨家AP,
然而這意味著你不能在網站上放上其他業者的電子商務網站相關的銷售連結
當然可能還是有許多人會忽視這項規定,但到底博客來抓不抓,
抓到後怎麼處理,仍是每個人在申請時應考量的因素。

註冊後博客來提供了好幾種形式的連結,
第一種是聯播貼紙,結果會像下面這樣,
其中第一個欄位是博客來內建的,其他的欄位可選擇0-3個想推薦的主題活動。


第二種則是簡單的搜尋工具貼紙
透過這個工具找到的購買訂單也都可以有分紅。


第三個主題活動貼紙和第一個類似但比較整潔俐落,
而且可以只推薦單一的主題活動就好,
取得程式碼以後結果會像是一張圖片。


最後一種銷售連結產生器則是我覺得博客來最吸引人的地方,
我們可以把博客來上的商品連結轉換成成自己的推薦連結,
這樣我們就可以在blog上介紹有試用過或是推薦的圖書音樂,
只要朋友們覺得喜歡,點下購買以後我們就能得到分紅,效果像這樣:
http://www.books.com.tw/exep/assp.php/your_id/exep/prod/booksfile.php?item=0010522255,
我們也可以利用圖片連結:


博客來 AP 廣告的收益會每季結算,只要大於500元就能且一定要申請!
如果過期好像就消失囉,這點要特別注意!

使用博客來AP廣告的好處在於博客來是大家線上買書的重點網站
如果我們在部落格上分享讀書心得,順便也放上書的推薦連結,
只要有興趣、有購買意願的人進入了博客來網站,
則我們就很有機會透過分享連結而獲得收益。
這種方式不像部落格寫手的置入性行銷那麼令人討厭和反感,
而是以分享心得的方式呈現,如果看的人剛好有興趣並購買,
則分享心得文章的作者也能多得到一點買書錢,之後又能多買點書多分享心得,
如此源源不絕,對作者和讀者都有利。

以上的運作模式已出現在幾個較知名的閱讀心得部落格網站上,
另外也有人利用部落格分享博客來折價券來吸引人氣,
再請使用折價券的網友由推薦連結進入購買,這樣分享者就能賺到錢。
還有當博客來特價時有許多人會自願幫忙代買,
我想這些代買者八成也都透過自己的推薦連結來購買商品,
如此一來經手金額的 2~4% 都成了收益,而找代買的人有得到折扣,皆大歡喜!

以上是關於博客來 AP 的介紹,
還有我目前所觀察到能透過博客來 AP 策略聯盟創造收益的方式,
如果有人有興趣、覺得自己好像能做,也可以開始創造自己的收益模式,
若大家還有其他運用方式也歡迎留言分享喔 ^^

(2012.02.20更新)
為了讓產生商品推薦連結更方便,我製作了一個 javascript 轉換工具,
放上部落格後以後就可以直接用商品連結寫推薦文章囉!
詳情請見:博客來AP策略聯盟商品推薦連結自動轉換工具


Yahoo!奇摩購物中心 - 大聯盟計畫平台
Yahoo!奇摩購物中心 - 大聯盟計畫平台 在之前似乎是叫「興奇科技大聯盟計畫」,
這個廣告服務和博客來非常相似,且Yahoo購物中心也是大家購物常用的網站,
所以只要文章有說服力,應該也能透過這項服務獲得不少收益。
不過因為我平常除了書之外也不太寫會讓人購買東西的文章,
(還是有人要向Oracle買下Java? XD)
加上已加入了博客來的獨家 AP,所以目前暫時沒有打算用這個來賺錢。

雖然自己沒有用,但既然要寫這篇文章,我還是整理一下相關的資料,
一方面給大家參考,一方面也留著給自己,說不定以後也會想加入呢!
Yahoo大聯盟計畫大部份的廣告方式都和博客來差不多,
只是在平台操作方面有些許不同,也多了和社群網站連結的分享方式,
除此之外應該沒什麼特別需要說明的,所以這邊直接進入重點,
也就是收益分享的比例!

看完上面很大一張表,相信大家可以找到適合自己的推薦方向,
Yahoo 大聯盟的廣告收益在交易結束後10天後若無退換貨就計入
每月結算,只要大於1000元就能申請!
這邊不像博客來大多是書所以很少錢,如果是高價的傢俱,賺起來可是很快的!
所以就算申請了沒有放在部落格上,自己要消費時拿來自己點似乎也不錯,
想想什麼信用卡回饋1%就很高了,現在只要自己申請一下,
也不用透過別人就能穩穩賺,也是個不錯的使用方式喔!


PChome 商店街分紅網
PChome 商店街分紅網 和上面介紹的兩個一樣是聯盟行銷的網站,
分紅網的回饋被稱為分紅紅利,紅利1點就相當於台幣1元。
分紅方式同樣是要有人透過推薦連結消費,
交易成功後30天內無退貨的話就可以獲得分紅點數

PChome 商店街分紅網和其他聯盟其實很像,
但又有一個比較不同的地方是每個加入聯盟的會員有自己的網站店面,
這樣可以讓會員在店面上把自己推薦的商品全都上架,
比起其他的廣告聯盟,這種方式可以將自己推薦的商品集中,
若有使用者的品味和會員非常相近,這種方式應該能一口氣帶來不少收益。
另外這種店面模式也可以滿足開店的夢想,
只要把推薦的東西上架就可以開賣賺錢,但又不用自己處理進出貨等細節,
這大概是分紅網和其他網站比起來最大的優點吧。

至於大家最關心的分紅比例方面,
PChome 商店街分紅網好像沒有獨立的說明解釋各類商品分紅的比例,
這也有可能是因為這個分紅網的商品是由各個商店街裡的商店出貨,
所以訂出的分紅比例可能也是由各個商站來訂,
而Yahoo和博客來都是自身網站的產品,所以分紅比例就可以很明確地訂出來。

分紅網的推薦方式共有四種:
  1. 推薦分紅商品:就是在自己的分紅網店面上架商品。
  2. 轉貼分紅連結:產生HTML語法連結,可以透過部落格、FaceBook等。
  3. 轉寄分紅資訊:可以寄送商品推薦郵件給朋友,也可以發行電子報。
  4. 發表分紅評論:發表對推薦商品的評論並放到分紅網的商店上。
總而言之,PChome 商店街分紅網也有其獨特之處,
且商店街的商品眾多,想要找到可以推薦的東西應該也很簡單。
不過就我自己購物時通常只會想找Yahoo購物中心或PChome購物,
對於商店街若不是便宜超多,不然還是不會想買。
也因為這樣PChome 商店街分紅網和Yahoo的比起來,
如果我要加入,應該也是會優先加入Yahoo的吧。


以上針對 CPA (Cost-per-Action) 廣告商的介紹已經完畢,
總而言之,若你是個容易煽動別人購買慾的人,
就非常適合用這種方式在 Blog 等地方加入這些工具來賺分紅囉!
大家可以試試看。

相關文章:
部落格廣告賺錢術(一):Google Adsense、BloggerAds、BlogAD 收益比較
博客來AP策略聯盟商品推薦連結自動轉換工具

更多外掛如相關文章推薦輪播、部落格廣告賺錢、社群網站外掛等,請見總整理文章:
Blog Plugins:部落格外掛大全整理,什麼都有、什麼都不奇怪


關鍵字:分紅, 收入, 網賺收益, 比較, 自己點, Facebook, 部落格, blog, 廣告, 賺錢, 停權, 資訊提供廣告, 網域廣告, 網路賺錢部落格, 申請, 下線, 獎金