Notes on Cocoa
Saturday, August 28th
11:37am

2 notes

Windows XP 2001 年推出,微軟要繼續支援 Windows XP 到 2020 年,也就是長達 19 還是 20 年。在台灣,判一個無期徒刑都不用關這麼久。

Friday, August 27th
11:12pm

1 note

想想,人活著好好的,用 C 產生 Javascript 物件傳到 WebView 裡頭真是要死了。

10:47pm

(via bullshit)

193 notes
bullshit:

Baaaaaaaalls!

(via escroto)

bullshit:

Baaaaaaaalls!

(via escroto)

2:36pm
capttaco's Briefs at master - GitHub

Briefs 1.0 開放原始碼。不過老實說,我一直搞不太清楚這個東西可以有什麼實際的用途。

6:14am
如果你有嚴重的自虐傾向…

如之前所說。如果你有一段 Javascript 是這樣:

function x(x) {
	return x + 1;
}

用 ObjeC controller 要 webView 產生上面那段 Javascript code,會是這樣:

WebScriptObject *obj = [webView windowScriptObject];
NSString *s = @"function x(x) { return x + 1};";
[obj evaluateWebScript:s];

非常想不開的話,你會寫成這樣:

#import <JavaScriptCore/JavaScript.h>

JSGlobalContextRef ctx = [[webView mainFrame] globalContext];

JSStringRef xName = JSStringCreateWithUTF8CString("x");
JSStringRef parameters0 = JSStringCreateWithUTF8CString("x");
JSStringRef parameters[1] = {parameters0};
JSStringRef body = JSStringCreateWithUTF8CString("return x + 1");
JSObjectRef x = JSObjectMakeFunction(ctx, xName, 1, parameters, body, NULL, 0, NULL);
JSStringRelease(xName);
JSStringRelease(parameters0);
JSStringRelease(body);

JSValueRef argument0 = JSValueMakeNumber(ctx, 1);
JSValueRef arguments[1] = {argument0};
JSValueRef result = JSObjectCallAsFunction(ctx, x, NULL, 1, arguments, NULL);
double r = JSValueToNumber(ctx, result, NULL);
NSLog(@"r:%f", r);
3:35am

1 note
總而言之

如果我們定義了一個叫做 x() 的 JS function,在 JS 裡頭要拿到他,有兩種不同的狀況:

  1. window.x,拿到這個 function 的物件
  2. window.x(1),執行這個 function。

所以 windowScriptObject 就會有兩種狀況,分別對應上面兩種狀況:

  1. [[webView windowScriptObject] valueForKey:@”x”];
  2. [[webView windowScriptObject] callWebScriptMethod:@”x” withArguments:[NSArray arrayWithObjects:[NSNumber numberWithInt:1], nil]];
    3:19am
    windowScriptObject

    如果我們想要讓我們的 controller object 與 webView 裡頭的 Javascript 溝通,其中一個關鍵就是 WebView 的 -(id)windowScriptObject。我們這邊先講從 ObjC 送東西到網頁裡頭,或是從 ObjC抓網頁裡頭的東西,先不談怎麼從 JS 送東西到 ObjC。

    簡單講,在 Javascript 裡頭,有一個物件叫做 window,而這個物件在 ObjC 中,就是 [webView windowScriptObject]。在 JS 裡頭,如果沒有特別定義,直接寫一個簡單的 function,這個 function 其實就會變成 window 的成員。回到前一篇的 JS code

    function x(x) {
    	return x + 1;
    }
    

    其實意思就是:

    window.x = function(x) {
    	return x + 1;
    }
    

    而其實這整段 function 都是一個物件,在 ObjC 中,我們如果想要拿 window.x ,就會拿到一個代表 window.x 的 WebScriptObject。而要拿 window.x,就是拿 windowScriptObject 的一個叫做 x 的屬性,所以我們這麼寫:

    WebScriptObject *xobj = [[webView windowScriptObject] valueForKey:@"x"];
    

    如果我們想要執行 x (也就是呼叫 x(),或 window.x()),有兩種方法,一種是要求 windowScriptObject 執行叫做 x 的 method,像是這麼寫:

    result = [[webView windowScriptObject] callWebScriptMethod:@"x" withArguments:[NSArray arrayWithObjects:[NSNumber numberWithInt:1], nil]];
    NSLog(@"result:%@", result);
    

    這段 code 相當於在 JS 中呼叫 window.x(1),注意,數字要包裝成 NSNumber 傳過去。另外一種方法是,我們直接先去拿 window.x 這個 WebScriptObject,然後由這個物件執行自己(對,JS 的 function 本身就是物件,所以可以先用物件的方式拿,然後物件自己執行自己),我們可以用 apply 或是 call。在 JS 裡頭是這樣:

    x.apply(x, [1]); 
    x.call(x, 1);

    ObjC 裡頭就會變成這樣:

    id result = [x callWebScriptMethod:@"call" withArguments:[NSArray arrayWithObjects:x, [NSNumber numberWithInt:1], nil]];
    id result = [x callWebScriptMethod:@"apply" withArguments:[NSArray arrayWithObjects:x,  [NSArray arrayWithObject:[NSNumber numberWithInt:1]], nil]];
    

    話說 Javascript 這個語言真是哭么的難懂。

    2:38am
    WebScriptObject

    在 Cocoa 裡頭,如果我們想要直接操作 WebView 裡頭的物件,而不僅只是滿足於讓 WebView 單單去 load NSURLRequest,大概有兩種主要的操作方式,一種是直接操作 DOM 物件,另外一種就是透過 WebScriptObject 操作。現在來講一下 WebScriptObject,其實前面那一篇講 JS Array 轉成 NSArray 也是這樣的東西。

    老實說,蘋果文件裡頭對於 WebScriptObject 講得實在不清不楚。WebScriptObject 簡單講就是網頁裡頭的 Javascript 物件,在 Javascript 裡頭不管是 function 或是 array,基本上都是一個物件,除了最基本的字串與數字外,我們要在 Objc 與 JS 之間,都是傳遞 WebScriptObject。

    真的要說起來有點麻煩,而且也是這兩天才比較搞懂裡頭是什麼東西。我們先來一個簡單的例子,假如我們的網頁裡頭,有這麼一個簡單的 JS:

    function x(x) {
    	return x + 1;
    }
    result = window.x(1);
    alert(result);
    

    我們在 ObjC 裡頭-假如我們現在有一個 ObjC controller 物件,這個物件有一個 WebView,是這個 controller 的成員變數,名稱叫做 webView,我們想要用 ObjC 直接產生像上面那樣的 JS 的話,就會是:

    WebScriptObject *obj = [webView windowScriptObject];
    NSString *s = @"function x(x) { return x + 1};";
    [obj evaluateWebScript:s];
    WebScriptObject *x = [obj valueForKey:@"x"];
    NSLog(@"x:%@", x);
    id result = [x callWebScriptMethod:@"call" withArguments:[NSArray arrayWithObjects:x, [NSNumber numberWithInt:1], nil]];
    NSLog(@"result:%@", result);
    
    1:07am

    2 notes
    Convert a Javascript array to an NSArray

    If you are working on a controller object which owns a WebView as its user interface, or a WebKit plug-in, you can use Javascript to call the methods of your controller object or plug-in. The Javascript-Objective C bridge can help you to convert the Javascript string to NSString, and convert Javascript number to NSNumber. However, if you pass a array from your Javascript code to your Objective C objects, the array will not be convert to NSArray, its class remains WebScriptObject.

    If we want to obtain the content of a Javascript array, we have to use the interface of WebScriptObject. Suppose we have a Javascript array which contains various strings, we may try to get each element in the array by using the following code:

    WebScriptObject *obj = (WebScriptObject *)JSArray;
    
    NSUInteger count = [[obj valueForKey:@"length"] integerValue];
    NSMutableArray *a = [NSMutableArray array];
    for (NSUInteger i = 0; i < count; i++) {
    	NSString *item = [obj webScriptValueAtIndex:i];
    	if ([item isKindOfClass:[NSString class]]) {
    		[a addObject:item];
    	}
    }
    
    Wednesday, August 25th
    6:12pm

    台灣詐騙集團技術世界第一,不但日韓警方來台取經,就連香港的詐騙集團,也派人來台灣向詐騙集團學技術!

    六名被捕嫌犯當中,其中一名四十二歲的朱姓男子,由於口音特殊,在追問之下,才發現是港仔來台學技術,而朱姓男子來台期間,也和詐騙集團成員一樣,每週一到週六,都過著軍事化的管理生活,平常不得對外連絡,只有星期天才放風休假,包括每一線人員的分紅制度和教戰手則,朱姓男子也坦承,台灣的詐騙集團真的組織嚴密,令人大開眼界。


    詐騙揚名 日韓警來學 歹徒也來取經 |社會新聞|中時電子報

    怎麼台灣詐騙集團的平時生活聽起來像富士康一樣;看來我應該不適合這個行業。

    2:05am
    12:37am
    美國速食業者漢堡王(Burger King)最近為這些猶豫不決的消費者,推出結合披薩與漢堡特色的新產品:披薩堡,提供了兩全其美的解決之道。不過它的熱量高達2500卡。

    漢堡王推披薩堡 熱量高達2500卡 | 國際新聞 | 蘋果日報 | 20100823 | 昔日新聞 | 壹蘋果網絡

    鄉親啊,這就是物質文明啊!