[ Greasemonkey ] Hello World

1. named the file ends with .user.js

The file content begin with some configuration, see example below.

xxxx.user.js

// ==UserScript==
// @name          Auto Login PAM
// @namespace     http://dsin.blogspot.com
// @description   auto login to PAM page
// @include       http://192.168.17.30:9090/pam/
// @include       http://192.168.17.30:9090/pam/?reurl=*
// ==/UserScript==
alert('Hello')

NOTE : can add many include ( ref ), and can use wildcard ( i.e. * )

2. drag-and-drop to firefox page. Firefox will pop-up to ask for installation

ref : greasespot

Advertisements

[ Java ] Reflection : invoke java method given a method as String

คล้ายๆ eval() ใน Javascript น้ะจ้ะ

ตัวอย่างน้ะจ้ะ เดิมเขียนแบบนี้

SimpleDateFormat sdf = new SimpleDateFormat("ddMMyy");
System.out.println(sdf.format(new Date()));

แต่ถ้าจะเขียนแบบ Reflection จะได้แบบนี้

SimpleDateFormat sdf = new SimpleDateFormat("ddMMyy");
Method m = sdf.getClass().getMethod("format", Date.class);
System.out.println(m.invoke(sdf, new Date()));

ข้างล่าง เป็น ดอกส์ (doc) โดยย่นย่อ ก็อปมาจาก yegor256

method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
method.invoke(obj, arg1, arg2,...);

เพิ่งรู้ว่า จาวาก็ทำอะไรพรรค์นี้ได้ เจ๋งดีเหมือนกันนะ

view detail

Better Javascript

Loop
1.

for (i = 0, max = myarray.length; i < max; i++) { 

2.

Count down to 0, is usually faster
it’s more efficient to compare to 0 than to the length of the array or to anything other than 0

For loop

for (i = myarray.length; i--;) {  

While loop

    i = myarray.length;  
while (i--) {  

For in / hasOwnProperty

Adding method to all objs

// somewhere else in the code  
// a method was added to all objects  
if (typeof Object.prototype.clone === "undefined") {  
   Object.prototype.clone = function () {};  
}  

Filter hasOwnProperty

// 1.  
// for-in loop  
for (var i in man) {  
   if (man.hasOwnProperty(i)) { // filter  
      console.log(i, ":", man[i]);  
   }  
}  
/* result in the console 
hands : 2 
legs : 2 
heads : 1 
*/  
// 2.  
// antipattern:  
// for-in loop without checking hasOwnProperty()  
for (var i in man) {  
   console.log(i, ":", man[i]);  
}  
/* 
result in the console 
hands : 2 
legs : 2 
heads : 1 
clone: function() 
*/  

Another pattern to filter

for (var i in man) {  
   if (Object.prototype.hasOwnProperty.call(man, i)) { // filter  
      console.log(i, ":", man[i]);  
   }  
} 

Or
1.

var i, hasOwn = Object.prototype.hasOwnProperty;  
for (i in man) {  
    if (hasOwn.call(man, i)) { // filter  
        console.log(i, ":", man[i]);  
    }  
}  

2.

// Warning: doesn't pass JSLint  
var i, hasOwn = Object.prototype.hasOwnProperty;  
for (i in man) if (hasOwn.call(man, i)) { // filter  
    console.log(i, ":", man[i]);  
} 

eval()

// antipattern  
var property = "name";  
alert(eval("obj." + property));  
  
// preferred  
var property = "name";  
alert(obj[property]);  

same as setTimeOut(), setInterval()

// antipatterns  
setTimeout("myFunc()", 1000);  
setTimeout("myFunc(1, 2, 3)", 1000);  
  
// preferred  
setTimeout(myFunc, 1000);  
setTimeout(function () {  
   myFunc(1, 2, 3);  
}, 1000);  

Here only un remains as a global variable polluting the namespace

console.log(typeof un); // "undefined"  
console.log(typeof deux); // "undefined"  
console.log(typeof trois); // "undefined"  
  
var jsstring = "var un = 1; console.log(un);";  
eval(jsstring); // logs "1"  
  
jsstring = "var deux = 2; console.log(deux);";  
new Function(jsstring)(); // logs "2"  
  
jsstring = "var trois = 3; console.log(trois);";  
(function () {  
   eval(jsstring);  
}()); // logs "3"  
  
console.log(typeof un); // number  
console.log(typeof deux); // undefined  
console.log(typeof trois); // undefined  

eval() can access and modify a variable in its outer scope, whereas Function cannot

(function () {  
   var local = 1;  
   eval("local = 3; console.log(local)"); // logs 3  
   console.log(local); // logs 3  
}());  
  
(function () {  
   var local = 1;  
   Function("console.log(typeof local);")(); // logs undefined  
}());  

string to number
Prevent octal confusion

var month = "06",  
    year = "09";  
month = parseInt(month, 10);  

Alternate string to number

+"08" // result is 8  
Number("08") // 8  

Code convention
Naming globals with all caps can reinforce the practice of minimizing their number and can make them easily distinguishable.

// precious constants, please don't touch  
var PI = 3.14,  
    MAX_WIDTH = 800; 

private with _

var person = {  
    getName: function () {  
        return this._getFirst() + ' ' + this._getLast();  
    },  
  
    _getFirst: function () {  
        // ...  
    },  
    _getLast: function () {  
        // ...  
    }  
};  

Other conventions :

  • private_ : name_, getElements_()
  • _protected properties, __private properties
  • In Firefox some internal properties not technically part of the language are available, and they are named with a two underscores prefix and a two underscore suffix, such as __proto__ and __parent__

ref : tutsplus

ajax comet basic tutorial

เพราะว่า server ไม่สามารถเปิด connection ไปยัง browser ได้
ทางเดียวที่เป็นไปได้คือ ให้ browser hold connection ไว้

เช่น ถ้าเป็น php ก็ใช้ sleep

แล้วไปแก้ปัญหา server timeout โดยการเปิด connection ใหม่ ( resetConnection )

resetConnection คร่าวๆ คือ ใข้ heartbeat

ก็คือ call function heartbeat ทุกครั้งที่ response กลับมา เพื่อกันไม่ให้ heartbeat มันไป resetConnection

var timeoutId = null;

function heartbeat(){

clearTimeout(timeoutId);

timeoutId = setTimeout(resetConnection, 10000); // 10 sec.

}

ถ้า connection มันขาดหายไป ( timeout ไปแล้ว ) มันก็จะ resetConnection ใหม่ให้เอง

ซึ่งปกติเขาใช้ iframe เป็นตัว connector กัน โดยเซต src ( location ) ของ iframe เป็นไฟล์ response เลย

แต่มันด้วยการที่มันเป็น iframe เลยมีปัญหานิดหน่อย คือ browser จะขึ้นสถานะเป็น Loading ตลอดเวลา เพราะว่า connection ไปยัง server ในหน้า iframe ไม่ได้ถูกปิดไป

วิธีแก้สำหรับ IE คือ

แทนที่จะใส่ iframe ตรงๆ ก็ไปใส่ iframe ไว้ใน ActiveRecord(“htmlfile”); ซึ่งเป็น object ของ IE

ซึ่ง htmlfile ของ IE มันแยกจากหน้าเวป ดังนั้น จะไม่มีสถานะ loading ใน browser มาให้วุ่นวายใจ

เช่น

oPage = new ActiveRecord("htmlfile");

oPage.open();

oPage.write("<html><body></body></html>");

oPage.close("");

# โดยอย่าลืมใส่ reference ไปที่หน้าปัจจุบันด้วย เพราะว่า htmlfile ของ IE มันแยกเด็ดขาดจากหน้าเพจจริงๆ ( ใช้ parent หรือ top เรียกไม่ได้ )

oPage.parentWindow._parent = self;  # คือ เซตให้เพจลูกเรียก parent._parent แล้วมาเจอ object นี้นั่นเอง
# ดังนั้นในเพจ response ใน iframe จึงเรียก parent._parent.heartbeat() ได้

# หมายเหตุ <em>_parent</em> เป็นชื่อเฉยๆ นะ จะเปลี่ยนเป็นอย่างอื่นก็ได้แหละ</strong>

oPage.body.innerHTML = "<iframe src=\"http://dsin.blogspot.com\"></iframe>"

วิธีแก้สำหรับ firefox คือ

firefox มีวิธีจัดการกับ HTTP streaming ได้ดีกว่า IE

แทนที่จะใช้ iframe ก็ให้ไปใช้ XMLHttpRequest แทน โดยดักจับ สถานะ .readyState เป็น 3 ( คือ ส่งแล้ว ยังไม่ complete )

ref : comet and reverse ajax book ( Apress )