Firefoxãé€ããã¹ãŠã®ãã©ãŠã¶ãŒã§ã®è€æ°è¡ããŒã¿è¡šç€º
ãã¹ãŠã®ã¹ã¯ãªããããŠãŒã¶ãŒããã³ã¬ã®ã¥ã©ãŒçšã®ãœãªã¥ãŒã·ã§ã³ã§ãããFirefoxçšã§ã¯ãããŸããã
s = function(){/* , */}.toString()
ããã«ãæ©èœãã©ã±ããã®ããã¹ããæ£èŠè¡šçŸã§ã¯ãªã¢ãããšãçŽç²ãªè€æ°è¡ããŒã¿ãåŸãããŸãã ã³ã¡ã³ã '* /'ã®æåŸã®æåãããŒã¿ã«å«ãŸããŠã¯ãªããªããšããäºå®ãç¡èŠããŸãã ããã念é ã«çœ®ããŠãå ¥åããã¹ãã«ã¯æå°éã®æ€èšŒãšå®å šãªæååã§ã®çœ®æãå¿ èŠã§ãããã®åŸãæååsãåãåã£ãåŸã«ãã©ã³ã¹ã³ãŒãããå¿ èŠããããŸãã
ããããäœããã®çç±ã§ãã®ã¡ãœããã¯Firefoxã§åãå ¥ããããŸãã-é¢æ°ãæååè¡šçŸïŒ.toStringïŒïŒã. toSourceïŒïŒïŒã«è»¢éãããšãããããçš®é¡ã®ã³ã¡ã³ããåã¿ä»ããŸãã ã³ã¡ã³ã以å€ã®æ§æçã«æ£ããããã¹ãã¯æå¹ãªãŸãŸã§ãããããã¯ãã¡ããããŒã¿ã®èªç±ãå³ããå¶éããŸãã ç¹ã«ãããã¹ãã¯æååãŸãã¯æ¹è¡ïŒè¡æ«ïŒã®åã®ãšã¹ã±ãŒãïŒã\ãïŒãå«ãéæšæºã®è€æ°è¡æååã«ã©ããã§ããæå³ã®ãªããæ§æçã«æ£ããè¡šçŸã®ãŸãŸã«ããŸãã éæšæºã®ããã¯ã¹ã©ãã·ã¥æ¹åŒã«ããããããããã®ãããªè€æ°è¡ã®æååã¯ãã¹ãŠã®ãã©ãŠã¶ã§ãµããŒããããŠããŸãã
é©åãªé¢æ°ããªãããããŠãŒã¶ãŒã¹ã¯ãªããã«GreaseMonkeyäœæè ã®ä»£ãããäœæããå¿ èŠããããŸãããããã«ã¯ãã³ã¡ã³ãè¡ïŒã¡ã¿ããŒã¿ãã£ã¬ã¯ãã£ãïŒãå«ãŸããŠããããã§ãã ã¡ã¿ããŒã¿æ§æïŒã@ããŒå€ãïŒã§ã¯ãè¡ã®çµããã«åŒçšç¬ŠãŸãã¯ããã¯ã¹ã©ãã·ã¥ã䜿çšã§ããŸããã ã¡ã¿ããŒã¿ã«ã¯ãã¹ã¯ãªããããŒãžã§ã³ã説æãè¿œå ã®ãã£ã¬ã¯ãã£ãã®ããŒã¿ãªã©ãå€ãã®æçšãªæ å ±ãå«ãŸããŠããŸãã ããããäžè¬çã«ãä»»æã®è€æ°è¡ããŒã¿ã®å Žåããããã®è¡šç€ºã¯éåžžã«äŸ¿å©ã§ãã çµå±ã®ãšãããåè¡ãç¹å¥ãªåœ¢åŒã«å€æããããããã¹ã¯ãªããåãããŠããªãæ å ±ãè€æ°è¡å«ããããšã§ã¹ã¯ãªãããåéããæ¹ãã¯ããã«äŸ¿å©ã§ãã
Firefoxå°çšã®.toStringWithCommentsïŒïŒé¢æ°ãããå Žåãäž¡æ¹ã®ã¡ãœãããããã°ã©ã ã§çµã¿åãããããšã§è§£æ±ºã§ããŸãã ããããããã¯ïŒå€æã§ããéãïŒããã§ã¯ãããŸããã ãã®åé¡ã解決ããããã«ãGreaseMonkeyã¯ç¹å¥ãªããŒã¿åãšæ§æãäœæããŸããïŒXML圢åŒã®è€æ°è¡ããŒã¿ã åŒã®ä»£ããã«ãã<ãã§å§ãŸããªãã©ã«ãã¹ã¯ãªããã³ãŒãã«èšè¿°ãããŸãã åçŽãªJavascriptã®å Žåãäºæ³ã©ããããã®æ§æã¯ä»ã®ãã©ãŠã¶ãŒãšåããšã©ãŒãåŒãèµ·ãããŸãã ãã®èšäºã§èª¬æãããŠããåé¡ãåŒãèµ·ããã®ã¯æ§æã®éäºææ§ã§ã-äž¡æ¹ã®æ§æãçµã¿åãããæ¹æ³ã¯èŠã€ãããŸããïŒevalïŒïŒããããŸããããã§ã«åŒçšç¬Šãååšããåäžè¡ã®ããŒã¿ã®ã¿ïŒã
ã¢ããªã³ã¬ãã«ã§å¯èœãªãœãªã¥ãŒã·ã§ã³ãã¹
ãšããã§ãGreaseMonkeyã¢ããªã³ã¬ãã«ã§ã®.toStringWithCommentsïŒïŒé¢æ°ã®äœæã¯ãä»ã®ç¹å¥ãªé¢æ°ã®äœæãšåããããç°¡åãªã¿ã¹ã¯ã§ãã GM / Scriptishã®èè ã¯ãã§ã«ãããææ¡ããŠãããããããŸããã XMLãªã©ã®æ¢åã®åŒãšã³ãžã³ã§éæã§ããæã倧ããªããšã¯ãéãã1æåãŸãã¯2æåã«æžããããšã§ãããããã¯å ã®éäºææ§ãšåããããã»ãšãã©äœ¿çšãããŸããã ãã©ãŠã¶ã«å¿ããŠæ§æãéžæããå€éšã³ãŒããžã§ãã¬ãŒã¿ãŒïŒPHPã¹ã¯ãªãããnodeJSããŸãã¯ãŠãŒã¶ãŒã®æãšé ïŒãå¿ èŠã§ãã
s = <![CDATA[ , CDATA ]]>.toString();
-Firefox + GreaseMonkeyïŒFx + GMïŒãŸãã¯Scriptishã®å Žå-ãŸãã¯ä»ã®ãã©ãŠã¶ã®äžèšã®ã³ãŒãã ããã§ã®ååã¯ãGreaseMonkeyã§ã¯ãã¹ã¯ãªããã³ãŒãå ã§è€æ°è¡ã®ä»»æã®ããã¹ãïŒã³ã¡ã³ããå«ãïŒãèš±å¯ããä»ã®ãã¹ãŠã®ãã©ãŠã¶ãŒã§ã¯èš±å¯ãããŠããªãããšã§ãã äž¡æ¹ãçµã¿åãããããšã¯äžå¯èœã§ãã
Fx + GMã®å Žåã次ã®æ§æãæå¹ã§ãã
s = <> , </>.toString();
ãŸãã¯
s = <anyName> , </anyName>.toString();
å éšã®ããã¹ãã«ã¯CDATAãå«ãŸããå ŽåããããŸãã ãã®XML圢åŒïŒïŒtypeof sïŒãèŠããšã 'xml'ãååŸããŸãïŒã解決ã«åœ¹ç«ã¡ãŸããã
çŽç²ãªFirefoxã«ã¯ãŸã 解決çããªãããšã«æ³šæããŠãã ããã ãããŠããã¯ããªãå¥åŠã§ã-ããªãã®ãµã€ãã§æã匷åãªéçºè ãµããŒãã§ããé·å¹Žã®éçºã§ããã.toStringWithCommentsïŒïŒã®ãããªæ©èœã§ã-ãããã ãããããœãªã¥ãŒã·ã§ã³ã¯MDNïŒMozilla Development NetworkïŒã®è žã«é ãããŠããã誰ãããããç¥ã£ãŠããã®ã§ããããïŒ
åè¡ã®æåã®ç ŽæïŒå€æïŒã䌎ã決å®
ããŒã¿ãç¹å¥ã«æºåã§ããå Žå-åŒçšç¬Šã§å²ãããããã¯ã¹ã©ãã·ã¥ãæåŸã«é 眮ããåæã«JSæ§æã®æå³ã§ããã¹ãå šäœãä¿è·ããïŒåŒçšç¬Šãšããã¯ã¹ã©ãã·ã¥ã®åã«ããã¯ã¹ã©ãã·ã¥ã眮ãïŒå Žåãè€æ°è¡ïŒãã©ãŒãããæžã¿ïŒããŒã¿ãè¡šãåé¡ããããŸããã ãããããã®ãããªè§£æ±ºçã¯åžžã«åãå ¥ãããããšã¯éããŸããã ãã£ã¬ã¯ãã£ããæåã®æªã¿ãèš±å¯ããªããŠãŒã¶ãŒã¹ã¯ãªããã®å Žåãããã¯é©åã§ã¯ãããŸããã
2æåã®éãããããœãªã¥ãŒã·ã§ã³ïŒãŠãŒã¶ãŒã¹ã¯ãªããã®ã¿ïŒ
éåžžã®ã¹ã¯ãªããïŒFxããŒãžã§ã³ã§ã¯çµæãçæãããªããããç°ãªãæ¹æ³ã§ããŒã¿ãçæããå¿ èŠããããŸãïŒãŸãã¯ãŠãŒã¶ãŒã¹ã¯ãªããã®2ã€ã®ããŒãžã§ã³ã®æå/ãµãŒããŒç·šéã§ãå€éšã¹ã¯ãªãããäºææ§ã®ããã«æå°éã®ä»å ¥ãå¿ èŠãšããå Žåã«åœ¹ç«ã¡ãŸãã ããã¯ããã¹ãŠã®ãã©ãŠã¶ã®æ£ããæ§æã«é¡äŒŒããããã«ãæåã®ãéªæªãªã埮調æŽã«åºã¥ããŠããŸãã
調æŽãç°¡åã§ããã°ããã»ã©ãäœåãªæåãåãŸãªããã°ãªããªãã®ã§ãããè¯ãã§ãã
// s Fx+GM; var isFxGM = typeof GM_getResourceText !='undefined'; // "=" , Fx+GM var f = function(CDATA, s){s //var f = function(CDATA, s){s= // Fx+GM Scriptish <![CDATA[0]]/* , CDATA *///]]> return s}; var currMeta = isFxGM ? f([]).toString() : f.toString(); var win = (typeof unsafeWindow !='undefined')? unsafeWindow: window; win.console.log(currMeta); // , win.console.log('--------------'); win.console.log(currMeta.replace(/(^[\s\S]*?\/\*\r?\n?|\*\/[\s\S]*$)/gm,'')); //
ããã§ã®ç§Theã¯ãäºåããŒã¿åŒãåçŽãªéèŠã§ãªãåŒs <ïŒ[CDATA [0]]ã§ãããCDATAãé åå€æ°ã®å Žåã¯èšå®ããå¿ èŠããªãããšã§ãã ãããã£ãŠãä»ã®ãã©ãŠã¶ãŒã§ã¯ãã¶ã€ã³ã¯ç¡èŠãããFx + GMã®å ŽåãåŒs = <ïŒ[CDATA [0]] ...]]>; è€æ°è¡ã®XMLããã¥ã¡ã³ãã§ãã
ãã®ãœãªã¥ãŒã·ã§ã³ã¯çžäºã«æä»çã§ãã 1ã€ã®ã³ãŒãã¯Fx + GMã§ã®ã¿åäœããä»ã®ã³ãŒãã§ã¯ãšã©ãŒãçºçããŸããä»ã®ã³ãŒãã§ã¯åäœããFx + GMã§ãšã©ãŒãçºçããŸãã ããã¯ãuserscripts.orgã§ã¹ã¯ãªãããå ¬éããã®ã«ã¯äžé©åã§ããuserscripts.orgã§ã¯ãã¡ã¢ãèªãã§ããªã人ã«ãšã£ãŠãã©ãã§ãæ©èœããã¹ã¯ãªãããæãŸããã®ã§ãã èªããªãããŒãã«ã€ããŠã¯ã2çªç®ã®ã¹ã¯ãªãããªãã·ã§ã³ãé©åã§ãã2ã€ã®ã³ã¡ã³ãæåãåé€ããŠãã¹ã¯ãªãããFx + GMã§å®å šã«æ©èœããããã«ããå¿ èŠããããŸãã ãã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
var win = (typeof unsafeWindow !='undefined')? unsafeWindow: window; var isFxGM = typeof GM_getResourceText !='undefined'; // "/*" "<!", Fx+GM var f = function(s){return(s= /*<![CDATA[*//* , CDATA */s//]]> )}; var currMeta = isFxGM ? f(' "/*" "<!" ').toString() : f.toString(); win.console.log(currMeta); // , win.console.log('--------------'); win.console.log(currMeta.replace(/(^[\s\S]*?\/\/\*\r?\n?|\*\/s[\s\S]*$)/gm,'')); //
ãã®ç¹å¥ãªè¡ã¯ãFirefoxã§æ£ããåäœããããã«ãã¹ã¯ãªããã䜿çšããå¿ èŠãããæ¹æ³ã§ãŠãŒã¶ãŒã«æãåºãããŸãã ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠã¯ãã<ïŒãã®åã«ãdelete "/ *"ããšããè¡ããããŸã ã¹ã¯ãªããã³ãŒãã®å 容ã¯ç°ãªãå ŽåããããŸããã¹ã¯ãªããã®ã¿ã¹ã¯ã¯ãã¹ã¯ãªãããé©åã«åäœããŠããªãããšãå€æãããŠãŒã¶ãŒã«ä¿®æ£æ¹æ³ãäŒããããšã§ãïŒå¿ èŠãªæ©èœã«å°éãããšãïŒã
Fx + GMã§åäœããã¹ã¯ãªãããäœæããä»ã®ãã©ãŠã¶ã«ã¡ãã»ãŒãžãéä¿¡ãããšããå察ã®ã¿ã¹ã¯ã¯ãæ®å¿µãªãã解決ãããŠããŸãããJSåŒã®ä»£ããã«XML圢åŒã䜿çšãããšãéåžžã®Javascriptãæ£ããåäœãã解決äžå¯èœãªã¿ã¹ã¯ãäœæãããããã§ãã evalïŒïŒã䜿çšããŠè§£æ±ºã§ããŸãããä»»æã®åäžè¡ã®ããã¹ãã®ã¿ã§ãïŒããšãã°ãJSæååã«ããŒã¿ãå ¥åãããªã©ãä»ã®ãœãªã¥ãŒã·ã§ã³ã¡ãœããã§ã¯ãŸã£ããåé¡ãããŸããïŒã æ°ããæ©èœïŒGM_toStringWithCommentsïŒïŒïŒãè¿œå ããŠGreaseMonkeyãšScriptishã®ã¢ããªã³ãã©ã°ã€ã³ãäœæããŠã¿ãããšãã§ããŸããããã«ã€ããŠã¯èšäºã®æåŸã§è©³ãã説æããŸãã ãã ããããã§ã¯å éšããGMãç¥ãå¿ èŠããããããåé¡ã¯éçºè ïŒGreaseMonkeyãŸãã¯ScriptishïŒããªãã€ã¬ã¯ãããããšããããšã§ãã ããã«ãããã¹ã¯ãªããã®å®å šãªäºææ§ã®åé¡ã解決ãããŸãã
éçºäŸ
ãŠãŒã¶ãŒã¹ã¯ãªããã¯ãã¹ã¯ãªããã®åã«ã³ã¡ã³ãã®åœ¢åŒã§ãã£ã¬ã¯ãã£ãã³ãã³ãã䜿çšããŸãã ãããã®åã«å¿ èŠãªã¹ã¯ãªãããæžããšããããã¯ïŒãã¹ãŠã®ãã©ãŠã¶ãŒã§ïŒæäœå¯èœãªãŸãŸã§ãã ããã¯éåžžãGreaseMonkeyã«åã蟌ãŸããç¹å¥ãªæ§æã䜿çšããŠãFx + GMã§XMLã¿ã°ã®ã³ã¡ã³ããã©ããããããã«äœ¿çšãããŸãã å šäœã®åé¡ã¯ãã¹ã¯ãªãããä»ã®ãã©ãŠã¶ãŒãšã®äºææ§ã倱ãããšã§ãã ã·ã§ã«äžã®ã·ã§ã«ã®ã¿-Chromeã®TamperMonkeyã¢ããªã³ããããåŠçã§ããŸãã ãããŠä»ã§ã¯å¯ŸåŠããŸãããã¹ã¯ãªããã®äœæ¥ãè€éã«ãããŠãŒã¶ãŒã®èŠ³ç¹ããã¹ã¯ãªãããå¥ã®ç¬èªã®ãªã¹ãã«è»¢éããŸãã ãŸããããã¯ã¯ãã¹ãã©ãŠã¶ãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããã
ããšãã°ãæ°ããããŒãžã§ã³ã®HabrAjaxã¹ã¯ãªããã§ã¯ãç»åïŒããŽïŒããã¡ã€ã«ããããŒã«æ¿å ¥ãããŸããããã¯ãFirefoxã·ã§ã«ã§åãå ¥ããããaboutïŒã¢ããªã³ããŒãžã®æ¡åŒµåã®åã«ããŽã衚瀺ãããä»ã®ãã©ãŠã¶ãŒã§ã¯ç¡èŠãããŸãã 500ãã€ããè¶ ããã³ãŒãã2åæžã蟌ãŸãªãããã«ãäžèšã®æ¹æ³ã§ãã£ã¬ã¯ãã£ãã䜿çšããŠããããŒãèªã¿åããããããããŒã¿ãååŸããŸãã ããã¯ããã©ã€ããŒãã¿ã¹ã¯ã ãã§ãªããããåªããã¹ã¯ãªããèªåæŽæ°ãµãŒãã¹ã«ãå¿ èŠã§ãã ããããŒãããã¹ã¯ãªããããŒãžã§ã³ã説æãå€æŽã®å±¥æŽïŒç¹å¥ãªèªå®¶è£œãã£ã¬ã¯ãã£ãã@updateãã§èšè¿°ãããŠããå ŽåïŒãèªã¿åãã * .meta.jsãä»ããŠãµãŒããŒäžã®å€æŽãšæ¯èŒã ã䟿å©ãªåœ¢åŒã§æŽæ°ããããšããå§ãããŸãã 衚瀺暩ã®ãã€ããŒããŒãžã§ã³ã®æŽæ°ãå¶éã§ããŸãã Firefoxã®ããŒãžã§ã³4ããã³0.9.13ïŒ2011幎11æ3æ¥ãFirefoxã®ããŒãžã§ã³8ïŒä»¥éã®Scriptishã§ãµããŒãããããã©ãŠã¶ãŒã¹ã¯ãªããã®èªåæŽæ°ãã¯ããã«è¶ ããå©äŸ¿æ§ãäœæããŸãã
ãŠãŒã¶ãŒã¹ã¯ãªããã®ãœãªã¥ãŒã·ã§ã³ãã¹ã®äŸ
GM / ScriptishãGM_toStringWithCommentsé¢æ°ãäœæãããšããŸãã 次ã«ããŠãŒã¶ãŒã¹ã¯ãªããã§è€æ°è¡ã®ããŒã¿ãåä¿¡ããã¯ãã¹ãã©ãŠã¶ãŒã¯ãäžå¿ èŠãªåé¡ãªãã«ãªããŸãã
var f = function(){/* , */}; if(typeof GM_toStringWithComments =='undefined') GM_toStringWithComments = function(f){return f.toString();}; var s = GM_toStringWithComments(f).replace(/(^function(){\/\*|\*\/$)/gm,'');
ããã§ãã®ã³ãŒããæ©èœããŸãããFx + GMïŒããã³Fxã®ã¿ïŒã§ã¯ç©ºã®æååãè¿ãããŸãã
ããã§ãç¹ã«ãŠãŒã¶ãŒã¹ã¯ãªããã«ã€ããŠã¯ãScriptishã«ã¯è¯ããã¥ãŒã¹ããããŸã...
æè¿ããã®ã¢ããªã³ã«ã¯ã¡ã¿ããŒã¿ãèªã¿åãããšãã§ããæ©èœããããŸã-toStringWithCommentsïŒïŒã®ãŸãã«ãã®ç®çãèšç»ãããŠããŸããããããéå®çãªã¢ããªã±ãŒã·ã§ã³ã§ããã GreaseMonkeyã«ã¯ãªãã®ã§ãæ瀺ãèªãŸãªããŠãŒã¶ãŒã®ããã«ããã®é¢æ°ãå£åã§å®çŸ©ããå¿ èŠããããŸã-Fx + GMã«åã笊å·ãä»ããŠããŠãŒã¶ãŒã«æ¬¡ã«äœããã¹ãããç¥ãããŸãã
ãã£ã¬ã¯ãã£ãã¯ãããŒãšå€ã®ãã¢ã®åœ¢åŒã§æ£ããå®è¡ããã説æãåéãããããäœã¬ãã«ã®ç®çé¢æ°toStringWithCommentsïŒïŒã眮ãæããªãããšã«æ³šæããŠãã ããã
APIé¢æ°Scriptish GM_getMetadataïŒïŒã«äŒããŸãïŒ
ããã¯ã¡ã¿ããŒã¿ãçæããŸã-ã³ã¡ã³ããšããŠèšèšããããã£ã¬ã¯ãã£ãã¯ããŠãŒã¶ãŒã¹ã¯ãªãããScriptishã«æž¡ãããŒã¿ãèªã¿åããŸãã äœæ¥ã«å¿ èŠãªããŒã¿ïŒã¹ã³ãŒãïŒã«å ããŠããŠãŒã¶ãŒã¯ã¹ã¯ãªããã®ååãããŒãžã§ã³ãã©ã€ã»ã³ã¹ãããã³ã¹ã¯ãªããã«åœ¹ç«ã€ããŒã¿ãäœæã§ããä»ã®ãã¹ãŠã®ãã£ã¬ã¯ãã£ãã«é¢ããæ å ±ã«ã¢ã¯ã»ã¹ã§ããŸããããšãã°ãã¹ã¯ãªããã®å€æŽã®åã説æ以åã®ããŒãžã§ã³ãšãµãŒããŒäžã®ã¹ã¯ãªããçªå·ã䜿çšããŸãã
Firefox + Scriptishçšã®åŸ æã®ã¯ãã¹ãã©ãŠã¶ãŠãŒã¶ãŒã¹ã¯ãªãããäœæããŸãïŒGreaseMonkeyã䜿çšãããšãæå調æŽã®å¿ èŠæ§ããŠãŒã¶ãŒã«éç¥ããŸãïŒã å®éã®åäœäŸã¯ã HabrAjaxã¹ã¯ãªããããŒãžã§ã³0.81+ã§èŠãããšãã§ããŸãã ã¹ã¯ãªãããã¡ã€ã«ã®å é ã«ã¯ãã¡ã¿ããŒã¿ã®ã©ãããŒããããŸãã Fx + GMã®å Žåãã¡ã¿ããŒã¿ã®æœåºãå¿ èŠãšããæ©èœãé¢ä¿ããŠããå Žåã«ã®ã¿ãäžäŸ¿ããæãåºãããŸãã ãŠãŒã¶ãŒã¯ãã¹ã¯ãªããã®2ãã€ããå€æŽããããã«æ±ããããŸãïŒæŽæ°ã®ãã³ã«ãããè¡ãå¿ èŠããããŸãïŒïŒãŸãã¯ãã¢ããªã³ãScriptishã«å€æŽããã ãã§ãã
çµæ
ã芧ã®ãšãããäžè¬çãªã¯ãã¹ãã©ãŠã¶ãœãªã¥ãŒã·ã§ã³ã¯èŠã€ãããŸããã§ããã ããããååšããªããããããŸããããäžäŸ¿ãã®åèšã«ãããã©ããã§è§£æ±ºããå¿ èŠããã£ãããå°ãªããšãåé¡ãææãããŸããã éåžžã®ã¹ã¯ãªããã®å ŽåãFirefoxã«ã¯ãŸã£ãã解決çããããŸããã userskiptovã«ã¯ãFx + GMã®åŒã®XMLæ§æã®åœ¢åŒã®éã¯ãã¹ãã©ãŠã¶ãœãªã¥ãŒã·ã§ã³ãšãä»ã®ãã©ãŠã¶çšã®ç¹å¥ã«ã©ãããããã³ã¡ã³ãããããŸãã Firefox + Scriptishããã³ãã®ä»ã®ãã©ãŠã¶åãã®ã¯ãã¹ãã©ãŠã¶ãœãªã¥ãŒã·ã§ã³ã¯ãã¡ã¿ããŒã¿ã®åä¿¡å°çšã§ãã
GreasemonkeyãScriptishããŸãã¯Javascriptã®toStringWithCommentsïŒïŒã®ãããªç¹å¥ãªæ©èœãçµéšãã誰ããç¥ã£ãŠããå Žåã¯ããç¥ãããã ããã 誰ããGMãScriptishã®éçºè åãã«åé¡ãå®åŒåã§ããããæ¢ã«èª¬æãããŠããå Žæãç¥ã£ãŠããå Žåã¯ãããã«ã€ããŠãç¥ãããŠãã ããã
ããã§ããŠãŒã¶ãŒã¹ã¯ãªããã®ãã£ã¬ã¯ãã£ã ïŒãã以äžïŒãèªã¿ããå Žåã¯ãFirefox + GMã®åå¥ã®ããŒãžã§ã³ãç¶æãããããŠãŒã¶ãŒã«ãªãã€ã³ããŒãç¶æããå¿ èŠããããŸãïŒãã ããScriptishã«ã¯æ³šæãå¿ èŠã§ãïŒã ã¿ã¹ã¯ã®ç¯å²ãè¶ ãã解決çãšããŠãä»»æã®ããŒã¿ãå¥ã®ãã¡ã€ã«ã«ä¿åããAJAXã§èªã¿åãããšã«åé¡ã¯ãããŸããã