BloggerAds廣告

相關文章

2011年6月14日 星期二

A very convenience way to use google map

Since i pubilshed the article about facebook share last time, i got so many new visitors~
It is pleased to know that my knowledge helps

Also i've got quiet alot visitors from western, i decided using english this time

Just discovered a very convenience way to use google map.
its called Google static maps





<img src="http://maps.google.com/maps/api/staticmap?
center=North Point
&zoom=12
&size=512x512
&maptype=roadmap
&markers=color:Red|label:A|North Point
&sensor=false"
/>


for the sake of demonstration, i have not escape the html
you should escape it
as you see, it just use an img HTML tag
of cause~ you cannot have any interactions but this is much easier to use then JS version

2011年3月30日 星期三

facebook sharer 使用詳解

(本文最後檢閱日期25th November, 2015)

added on 26th October, 2013
這篇是講解facebook sharer 的機制
sharer 的其他設定及使用方法請到小弟另一篇文章
facebook sharer 使用詳解 之 description, title 和 image

facebook sharer是一個使人又愛又恨的功能
你永遠也不知道要如何設定才能正確顯示

這個問題以前每天都有上千上萬的人在facebook developer forum 問
但通常都沒有人回答
就算有,他們的 solution 多數一樣沒有效

小弟也鑽研了好久的時間
現在總叫略有小成跟各位分享

sharer是啥?
就是facebook 的share link功能了
用來分享網頁的
它的正身是www.facebook.com/sharer.php(updated at 5th November, 2013)
https://www.facebook.com/sharer/sharer.php

再來看你會見到sharer帶兩個參數
分別是u和t
u是URL, t是title
例如www.facebook.com/sharer/sharer.php?u=http://www.littleshell.net&t=littleshell的網站

(added on 10th April, 2015)
sharer已經不再support t 這個參數

看到這裡各下可能會想
e??正~!很易用耶~有啥難??
小弟想當年第一次接觸sharer時也是這樣想
不過別發夢了, 沒這樣易

sharer的運作是如何的呢
它會讀取參數u, 即url
然後會extract url 裡的html
最後變成Open Graph object (Open Graph是另一個大課題, 不在此說明)

u 收到了, 可是 t 呢??對不起, t 它是不會理會的
真不知道facebook的工程師們如何想的
extract了後, 例如找到了對的title 就會顯示title, 否則會留空
(title 的詳細設定方法請到facebook sharer 使用詳解 之 description, title 和 image)
之後.........它就會可惡地把這個結果cache 30mins~一天

因為會cache 的原故
這就成了為何很多人在說代碼可行但其他人照用就不行
解決的方法不難, 只要share 隨意加些參數在url 後就行了
例如www.littleshell.net/index?test=1 總之就是保持url 是unique就可以了

這做法可瞞過sharer使它以為是另一個新的graph object
到測試完成後把多餘的添加參數拿走就好

要做一個sharer懂看的html 也不難
可能你都看過很多不同的方法
不過因facebook 現在要行open graph 的原故
舊的方法不太穩定, facebook似乎也不再support舊方法了, 不建議用

我們要用上open graph protocol(og), 故此
<html>裡要加一個attributes 讓html知道og 是甚麼
<html xmlns:og="http://ogp.me/ns#">

然後最基本, 你需要加上三個og properties, 分別是
<meta property="og:title" content="The Rock"/>標題
<meta property="og:image" content="http://ia.media-imdb.com/rock.jpg"/>圖示
<meta property="og:description" content="blar blar blar blar blar"/>敘述

基本的用法就是這樣了
一般來說這段html 都不會有問題的
詳細用法請參閱 facebook sharer 使用詳解 之 description, title 和 image

重頭戲到了
依照上面的寫法
你很開心的share了
有幾個字你不滿意, 想改

ar ......媽的...
cache了改不到???

別慌, 還有一個工具未介紹
就是url Linter debugger了
是一個sharer的 debug工具
http://developers.facebook.com/tools/lint
http://developers.facebook.com/tools/debug (updated at 13rd March, 2012)

這會告訴你facebook 在將要被share的url 裡extract 了些甚麼
正式share 前不況用先來這裡測試
Linter 還有一個妙用
它有把cache renew的神效

就是說當我用Linter來測試www.littleshell.net
本身sharer.php裡的cache也有可能被更新!

若果依然都不能......
added on 25th November, 2015
這有可能要檢查一下您的網址是否public accessible
eg http://192.168.123.123 像這樣只有自己才能看到的網址facebook是不可能找到資料的

是否有redirect script?
facebook 是找取網頁render好的那刻的html,所以如果你的網頁有跳轉頁面的話那facebook 只能抓到跳轉前的html
換句話說, 如果你的頁面是用javascript 控制的話, 那facebook 是會抓javascript運行前的html source code

時間線是這樣的
server 回傳需要的html > facebook 抓取server回傳的html >  讀取css, js 等等 > browser 排版 > javascript 開始運行

是否有密碼保護??
例如.htaccess 等等 facebook 同樣是抓不到資料的





若果依然都不能......
對不起了, 小弟暫時也無能為力

有說得不明白的地方, 還請指正, 謝謝

2011年2月27日 星期日

Syntax Highlighter

// Created at 27/2/2011 2:14AM
// by littleshell

package com.blogspot.littleshellMultimedia {
 import flash.display.Sprite;
 import flash.display.Graphics;
 
 import flash.net.URLRequest;
 import flash.net.navigateToURL;
 
 import flash.events.MouseEvent;
 
 [SWF(backgroundColor = "0xFFFFFF", width = "120", height = "90")]
 
 public class HelloWorld extends Sprite {
  
  public function HelloWorld() {
   var _homeButton:Sprite = makeButton();

   _homeButton.buttonMode = true;
   _homeButton.addEventListener(MouseEvent.CLICK, homeButton_click);
   
   addChild(_homeButton);
   
   trace(getMessage());
  }

  //visit Syntax Highlighter's homepage
  public function gotoSyntaxHighlighterWebsite():void {
   var _uq:URLRequest = new URLRequest("http://alexgorbatchev.com/SyntaxHighlighter/");
   navigateToURL(_uq);
  }
  
  //return the contents of this post
  private function getMessage():String {
   var _myMessage:String = "";

   _myMessage += "各位好~ 寫了兩篇, 發現要在blogger 落script 異常困難";
   _myMessage += "不過昨天小弟找到了解決的方案!!就是Syntax Highlighter !!";
   _myMessage += "以後可以貼出像樣的code 了~ :D";

   _myMessage += "呢篇野唔知有幾多人識睇呢";

   return _myMessage;
  }
  
  private function makeButton():Sprite {
   var _b:Sprite = new Sprite();
   var _g:Graphics = _b.graphics;

   _g.beginFill(0xFFCCFF);
   _g.drawRect(0, 0, 32, 32);
   _g.endFill();
   
   return _b;
  }
  
  private function homeButton_click(e:MouseEvent):void {
   gotoSyntaxHighlighterWebsite();
  }
 }
}

2011年2月24日 星期四

解決 AS2 Sound class 不能獨立調整聲音問題

暫時這blog 都未有人流, 小弟暫且假設到我blog 的人對AS都有認識

若各下真的看不懂的話歡迎私底下和小弟聯絡

不知道這個問題是否很多人都懂解決

沒所謂了,還是分享一下,也許對一些人會有幫助

請看看以下的code:
var withBGSound:Boolean = true;
var withEffectSound:Boolean = true;

var bgSound:Sound = new Sound();  //background music
var effectSound:Sound = new Sound();  //sound effect


init();

function init():Void {

  bgSound.attachSound("bg_sound");
  bgSound.start(0, 9999);  


  btnBGSoundSwitcher.onRelease = btnBGSoundSwitcher_onRelease;
  btnEffectSoundSwitcher.onRelease = btnEffectSoundSwitcher_onRelease;

}
//do somthing then play the effect sound
function shoot():Void {
  //do somthing


  if(withEffectSound){

   effectSound.attachSound("bomb_sound");
   effectSound.start(0, 1);
  }
}

//onRelease handler for btnBGSoundSwitcher, used to switch on/off the background music
function btnBGSoundSwitcher_onRelease():Void {
  if (withBGSound) {
   withBGSound = false;
   bgSound.setVolume(0);

  }else {
   withBGSound = true;
   bgSound.setVolume(100);
  }
}

//onRelease handler for btnEffectSoundSwitcher, used to switch on/off the effect sound
function btnEffectSoundSwitcher_onRelease():Void {
  if (withBGSound) {
   withBGSound = false;

   bgSound.setVolume(0);
  }else {
   withBGSound = true;
   bgSound.setVolume(100);
  }
}
如果我按下了btnBGSoundSwitcher將會發生甚麼事呢??

我猜大家都會覺得只餘下effectSound 會在響吧

不過對不起, 大家都錯了

結果是兩個聲都會一塊兒消失

AS2裡的Sound class 確實是很麻煩
根據文檔, Sound.setVolume()這個 method 是一個instance method

那就是說, 這個method 理論上是對Sound class 的instance生效

可是不知怎的這個 method 會對全世界的Sound instance 生效
解決方法就是用channel 的概念 --- 每個聲源都獨立的聲軌負責

Sound class的constructor帶一個參數 -- target:Object

不過另一個問題出現

他說是Object, 小弟今天測試過是不行的

一定要是MovieClip

嗚.....這樣要寫個SoundChannel class 就好煩了

既然要用MovieClip

那就是說我現在有兩個channel -- 一個播音樂, 一個播音效

就要用兩個MovieClip了

其實....AS2 裡我不太喜歡好段段開粒不是用來display 的MovieClip

改寫頭8行:
var withBGSound:Boolean = true;

var withEffectSound:Boolean = true;

var mcBGSoundChannel:MovieClip = this.createEmptyMovieClip("mcBGSoundChannel", 0);

var mcEffectSoundChannel:MovieClip = this.createEmptyMovieClip("mcEffectSoundChannel", 1);

var bgSound:Sound = new Sound(mcBGSoundChannel);  //background music

var effectSound:Sound = new Sound(mcEffectSoundChannel);  //sound effect

再試試~

只餘下聲效了:D


2011年2月16日 星期三

在ActionScript裡防止以Cheat Engine 修改數值

年一個專案中客戶竟然想到要用Cheat Engine 來試
結果數值事無忌憚地被修改


煩擾了一星期總算有點微目,小弟在這裡分享一下


是次的測試環境為:


Windows XP SP3
Flash CS3 ActionScript 3 FlashPlayer 9
Cheat Engine 5.5


我們要測試的是myNum這個數
我用最正路的方法define myNum, 並以一個textField 來顯示
做了一個button來改變myNum:
var txtDisplay:TextField = new TextField();
var storage:Object = new Object();
var myNum:int = 0;


txtDisplay.autoSize = TextFieldAutoSize.LEFT;
txtDisplay.appendText(myNum.toString());


addChild(txtDisplay);


btn.addEventListener(MouseEvent.CLICK, btn_click);


function btn_click(e:MouseEvent) {
myNum++;
txtDisplay.text = myNum.toString();
}


遺憾地
這個寫法小弟只用了三次高階搜尋就能找出並鎖住myNum了


那解決方法呢??
其實不難
我的做法就是把myNum塞進object 就可以了:
var txtDisplay:TextField = new TextField();
var storage:Object = new Object();
storage.myNum = 0; 就是把myNum塞進一個object裡


txtDisplay.autoSize = TextFieldAutoSize.LEFT;
txtDisplay.appendText(storage.myNum.toString());


addChild(txtDisplay);


btn.addEventListener(MouseEvent.CLICK, btn_click);


function btn_click(e:MouseEvent) {
storage.myNum++;
txtDisplay.text = storage.myNum.toString();
}


同樣, Cheat Engine 三次高階搜尋就能找出myNum的值, 不過已經鎖不住myNum了~ : D
小弟亦以2bytes 及4bytes低階搜尋測試, 前者結果一樣, 後者五十多個怪怪的result, 改不了


有朋友或者會問, AS2 呢??
這個很有趣
我把profile 調成ActionScript2 FlashPlayer 8
並以下面的code 測試
var myNum:Number = 0;
var txtDisplay:TextField = this.createTextField("txtDisplay", 0,0,0,0,0);


txtDisplay.autoSize = true;
txtDisplay.text = myNum.toString();


btn.onRelease = function(){
myNum++;
txtDisplay.text = myNum.toString();
}
結果不論高階或是低階, 2bytes 或4bytes , 也都搜尋不到myNum
因為AS2對數字只有Number可用, 是個浮點數 , 故小弟還測試過以Float truncated搜尋, 結果一樣都是搜尋不到myNum
若然各位高手有破解之法或更好的預防方法, 還望賜教

2011年1月14日 星期五

blogger開啟

各位好
小弟細蜆 littleshell

在這裡我會分享我在RIA和Multimeida路上的一切
也歡迎在這結識八方英雄豪傑

小弟功力不高
僅以此博客拋磚引玉

還望各位賜教

謝謝