網頁

2015年12月14日 星期一

MSSQL server學習筆記-Copy table

複製table的資料到另一個table時,要注意primary key那個欄位(或自動遞增)要先去除,若是希望一塊複製過去,則要將啟動Identity insert的功能,指令如:SET IDENTITY_INSERT (table_name) ON

SET IDENTITY_INSERT sometableWithIdentity ON

資料insert完後要再執行OFF

參考網址:
SQL SERVER – Enable Identity Insert – Import Expert Wizard


2015年12月7日 星期一

jQuery UI DatePicker中文化

jQuery ui中文化有兩種方式(其實兩種都一樣)

第一種方式:自己客製化
//設定中文語系, 取自http://blog.e-happy.com.tw/?p=5011
$.datepicker.regional['zh-TW'] = {
   dayNames: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
   dayNamesMin: ["日", "一", "二", "三", "四", "五", "六"],
   monthNames: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
   monthNamesShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
   prevText: "上月",
   nextText: "次月",
   weekHeader: "週"
};
//將預設語系設定為中文
$.datepicker.setDefaults($.datepicker.regional["zh-TW"]);

第二種方式:使用jQuery ui提供的i18n,直接到GIT Hub jQuery ui i18n下載datepicker-zh-TW.js,在jquery-ui.js前加入datepicker-zh-TW.js,方式如下:
<script src="datepicker-zh-TW.js"></script>
<script src="jquery-ui.js"></script>

參考網址
[jQuery] 如何為 DatePicker 加上中文化日期選項?
GIT Hub jQuery ui i18n

2015年9月19日 星期六

Spotify Mac版在換了Facebook密碼後就無法登入

常用的Spotify Mac版因為前陣子換了Fb的密碼後就無法使用了,以往都會在個人應用程式上直接砍掉應用程式許可重新再登一次,不過這次想想有沒有更好的方式,找啊找看到這篇文章:SOLVED: Spotify desktop client communication failed

很好奇的看到所謂的"On the line App Passwords",可能是翻譯的問題,這我還真的沒看過,仔細看了下自己的,發現就在 https://www.facebook.com/settings?tab=security&view 中的"應用程式密碼"這個選項,按下“產生應用程式密碼”就會出現底下的視窗

看起來Spotify就是可以用這方式產生一個登入用的帳密。直接按下“產生應用程式密碼”,出現底下的視窗


打入Spotify按下產生密碼就行了,將密碼複製後,直接打入email及這個密碼做登入就ok了

參考網址:
SOLVED: Spotify desktop client communication failed

2015年9月12日 星期六

使用Chrome或Firefox發生:伺服器的暫時 Diffie-Hellman 公開金鑰不足

最近使用Chrome時查看問題時,原本寫好好的案子突然出現"伺服器的暫時 Diffie-Hellman 公開金鑰不足",一開始以為發生什麼大事,仔細查了一下才發現是Chrome更新版中針對ECDSA and DSS ciphers是要放棄不使用了。不過這下可好,Chrome及Firefox都不能用,程式沒當但等同是當了,仔細查了下,看到這篇:解決「伺服器的暫時 Diffie-Hellman 公開金鑰不足」,看起來是之前TLSv3的問題等造成後續處理。

查了下原本建好的設定
<Connector protocol="HTTP/1.1" port="8443" maxHttpHeaderSize="8192"
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" disableUploadTimeout="true"
                   acceptCount="100" scheme="https" secure="true"
                   SSLEnabled="true"
                   clientAuth="false" sslProtocol="TLS"
                   keystoreFile="{路徑}/ngss_cer/key.jks"
                   keyAlias="xxx"
                   keystorePass="xxxxxx"
                   truststoreFile="{路徑}/key.jks"
                   truststorePass="docsntnu" URIEncoding="UTF-8"  />


參考了ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEYSSL/TLS, ciphers, perfect forward secrecy and Tomcat,看起來只要加上ciphers我設定。更正設定如下:

<Connector protocol="HTTP/1.1" port="8443" maxHttpHeaderSize="8192"
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" disableUploadTimeout="true"
                   acceptCount="100" scheme="https" secure="true"
                   SSLEnabled="true"
                   clientAuth="false" sslProtocol="TLS"
                   ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
                            TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,
                            TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,
                            TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA"
                   keystoreFile="{路徑}/ngss_cer/key.jks"
                   keyAlias="xxx"
                   keystorePass="xxxxxx"
                   truststoreFile="{路徑}/key.jks"
                   truststorePass="docsntnu" URIEncoding="UTF-8"  />

重啟Tomcat後就ok了。

參考網址:
Disabling SSLv3 and SSLv2 in Tomcat and JBoss Web
ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY
SSL/TLS, ciphers, perfect forward secrecy and Tomcat
服務器有弱短暫的Diffie-Hellman公開 (Server has a weak ephemeral Diffie-Hellman public)

2015年8月26日 星期三

Yosemite 10.10.5更新後Apache無法啟動

前陣子更新到Yosemite 10.10.5後,今天發現apache無法啟動了,使用apachectl configtest指令檢查後,發現ssl設定看來在這次更新後被覆蓋掉了。
$sudo apachectl configtest
AH00526: Syntax error on line 144 of /private/etc/apache2/extra/httpd-ssl.conf:
SSLCertificateFile: file '/private/etc/apache2/server.crt' does not exist or is empty

照著Mac學習筆記-開啟HTTPS那時所寫的,server.crt及server.key檔放置的path修改後,就又正常了

參考網址:
Mac學習筆記-開啟HTTPS
Yosemite 10.10.5 Update Disabled Apache

2015年8月4日 星期二

在OS X安裝mcrypt

安裝就執行底下命令(php55-mcrypt非必要,只是我有這需求)
$brew install mcrypt php55-mcrypt

若之前有安裝過freetype,就會出現底下訊息
==> Installing php55-mcrypt from homebrew/homebrew-php
Error: You must `brew link freetype' before php55-mcrypt can be installed

執行底下命令
$brew link --overwrite freetype
回應如下
Linking /usr/local/Cellar/freetype/2.5.5... 8 symlinks created

再執行底下命令
$brew install  php55-mcrypt

回應如下
==> Installing php55-mcrypt from homebrew/homebrew-php
==> Installing php55-mcrypt dependency: autoconf
......以下省略

這樣就ok了

參考網址:
Installing mcrypt extension for PHP on OSX Mountain Lion
How to Install mcrypt for php on Mac OSX 10.9 Mavericks for a Development Server

2015年8月1日 星期六

設定好router卻無法直接在url上直接使用

安裝好Laravel後,在看router這篇時,寫成底下這樣
Route::get('lava', function () {
    return 'Hello World';
});

卻發現無法直接使用http://localhost/~alvin/lara/lava,而要用http://localhost/~alvin/lara/index.php/lava,多了index.php實在很奇怪。雖然認為問題出在.htaccess,但一直不知道是什麼問題,看了這篇.htaccess rewriterule not working correct on mac才想到因為Mac上我是直接使用user下的Sites,所以應該要做RewriteBase的設定才是,如下設定
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On
    RewriteBase /~alvin/lara #新增這行

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

這樣就可以正常使用了

參考網址:
How can I remove “public/index.php” in the url generated laravel?
.htaccess rewriterule not working correct on mac

2015年7月31日 星期五

安裝Composer

執行底下指令就可以安裝了
$cd /tmp (先換到tmp目錄)
$curl -sS https://getcomposer.org/installer | php

得到以下訊息
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /private/tmp/composer.phar
Use it: php composer.phar

再執行底下指令改成composer,這樣就可以直接執行composer了
$mv composer.phar /usr/local/bin/composer
$composer
回應如下
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.0-dev (bd2d7eba05dc6a51dbbad780b6f0eb505accba75) 2015-07-31 08:06:09
......以下省略

若要更新到最新版:
$ composer self-update

回應如下
Updating to version a67eaf04c7eee3d10d7c64f3eef47995ec150ffe.
    Downloading: 100%         
Use composer self-update --rollback to return to version 523aef76d0fa29c18bf42264e88fc9b58acf825c

參考網址:
Composer官網-Getting Started

2015年7月29日 星期三

EaselJS的Shap如何加入mouse over

EaselJS很好用,但不知為什麼想要加入mourse over的事件,弄半天查半天資料,卻一直只能click卻不能mouse over,看半天才發現有底下兩個有關

enableMouseOver();
mouseEnabled = true;

在stage中的item若要mouse over能被偵測到,stage必需要enableMourseOver且mouseEnabled也要打開才行,預設下mouseEnabled是開啟,但enableMourseOver則否,要特別啟動它。所以code如下:

var stage = new createjs.Stage("text");
stage.mouseEnabled = true;
stage.enableMouseOver();
var circle = new createjs.Shape();
circles.on("mouseover", function (evt) {
    var target = evt.target;
    //do something...
});
stage.addChild(circles);
stage.update();

更動滑鼠標示:
target.cursor = "pointer";

參考網址:
EASELJS MOUSE INTERACTION
Mouse event example
TweenLite-Example

2015年7月28日 星期二

使用FB.ui在手機上畫面問題

最近接一個案子,需要在pc及手機上都能用FB.ui來分享文字,不過發現在手機上會有底下的狀況,左邊是android手機,又邊是iOS


看起來有2個問題
  1. Layout中的z-index安排
  2. 寬高在不同device有不同的顯示方式,但高都用到100%
查了半天資料,大多數的解決方案是
  1. 使用fbxml重新定義
  2. 直接使用css去控制
解決問題時發現,若是要針對整個對話框做設定,例如z-Index,是一定要用fb_dialog,若是對話框的寬高,就要用FB_UI_Dialog。

/*Facebook UI的對話框整個 */
.fb_dialog{
  z-Index: 99999 !important;
}

/*控制對話框寬高使用底下這個*/
.FB_UI_Dialog {
  width: 320px !important;
}

參考網址:
How to resize Facebook UI dialog
Facebook “Invite” 弹出窗口

FB ui在Loading時一直出現500的error


今天案子放上正式機上,FB.ui就出現無法使用的狀況,可笑的是“只有我和主要設計師不能用”,更可笑的是“我不知道只有我和主要設計師不能用,還一直找bug”,弄半天才有人跟我講,他可以用,我才找朋友測看看,才知道只有我不能用,而我已經將想得到的方法測過一輪了。而這資訊立即讓我想到之前清除Facebook Open Graph快取及測試Facebook分享的畫面,八成是Cache無法清除。趕緊去https://developers.facebook.com/tools/debug/og/object/ 丟入原測試用link清掉,到丟入上線網址清掉,再試一次就沒問題了。

仔細想想造成這問題的原因,八成是底下的幾個狀況
  1. 使用同一個appid,但上線前沒改url,發現不對後才改
  2. 在開發時就開放此api,上線時沒改url,即使改了url,也可能導致cache住,最好是要先關閉 -> 更改url ->開放
  3. 在開發時因為時常在debug,所以ui開一開也沒有關,或上傳錯誤資料到一半就掛掉,造成cache住
下回還是要注意一下,要嘛分開用,要嘛上線前先更動url,要嘛就隨時清cache.....

2015年7月24日 星期五

儲存console.log的特定資料

今天在處理圖檔資料時,一直發現無法取樣到pixel,使用console.log一個個log出來,pixel有兩三十萬筆,一個個print出來資料量太大沒用外,也造成瀏覽器整個delay,畢竟我的需求是想查看Array中資料是否有0以外的資料,我是否有取錯圖檔等,最後想到儲成file再用編輯器看是最快,不過遇到兩個問題
  1. 陣列要一個個拿出來print再存?
  2. js怎存檔?
第一個問題,可以直接用JSON處理。
第二個問題查了下,看到這篇 How to save the output of a console.log(object) to a file? 就解決了我這兩個需求。這邊做下記錄。

(function(console){

console.save = function(data, filename){

    if(!data) {
        console.error('Console.save: No data')
        return;
    }

    if(!filename) filename = 'console.json'

    if(typeof data === "object"){
        data = JSON.stringify(data, undefined, 4)
    }

    var blob = new Blob([data], {type: 'text/json'}),
        e    = document.createEvent('MouseEvents'),
        a    = document.createElement('a')

    a.download = filename
    a.href = window.URL.createObjectURL(blob)
    a.dataset.downloadurl =  ['text/json', a.download, a.href].join(':')
    e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
    a.dispatchEvent(e)
 }
})(console);

文中也提到,Chrome其實可以直接save,link: Right click > Save as in the Console panel to save the logged messages to a file.

參考資料
How to save the output of a console.log(object) to a file?
A collection of helpful snippets to use inside of browser devtools - console-save.js

2015年7月3日 星期五

稍微強化script_tags防止XSS攻擊

用strip_tags用這麼久才知道,原來它沒法完全去除,雖然還是有些東西可以拿掉,如:onmuouse="alert('text')這類,但script tag拿不掉,很容易就中XSS攻擊,參考了下wordpress中的wp_strip_all_tags的寫法,基本上只是增加了pre_replace這行,至少將style或script的內容拿掉就能阻止大多數的XSS攻擊了。

function strip_all($string){
    $string = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $string );
    $string = strip_tags($string);
    return $string;
}


參考網址:
Function Reference/wp strip all tags

2015年6月28日 星期日

無法重新定義pluggable function: wp_notify_postauthor()

最近接了個維護案,做了更新後,重新啟動plugin,卻出現底下的訊息

Fatal error: Cannot redeclare wp_notify_postauthor() (previously declared in /ae/wp-includes/pluggable.php:1003) in /ae/wp-content/plugins/ae-menu-pages/ae-menu-pages.php on line 120

本以為是更新後造成問題,但查半天發現主要是重新定義wp_notify_postauthor造成的,這個function是個pluggable function,讓開發者可以在plugin中重新定義的,看半天並不覺得有任何問題,直到查到這篇How to Override a Pluggable Function

原文解說如下:
the reason it needs to be wrapped in function_exists is because within the context of a plugin activation, the function does already exist. This is due to the way WordPress activates plugins in a sandbox, which is necessary to enable it to recover from fatal errors in the activated plugin. Technically, once the plugin is activated the function_exists check would not be necessary, but you'd never be able to activate that plugin via conventional means without it. –  Milo Sep 24 '12 at 15:57

試了後確定是這個問題,總之,不管是否這個function是在wordpress載入預設的同名function前就宣告了,就是一定要加入function_exists這個判斷如下:
if( !function_exists() ):
    function wp_notify_postauthor() {
        //執行內容
    }
endif;


參考網址:
How to Override a Pluggable Function
Customizing the new user email with a pluggable function

2015年6月26日 星期五

不同的系統(mac及linux)間的網站檔案移動,最好別用tar打包上傳

今天的移機學到一項很重要的事,若是不同的作業系統的網站檔案做移動,別使用tar做打包後。

因為現今大家大多都使用虛擬空間,替人做案子時,測試機及正式上線機是不同虛擬空間廠商也是有可能的事,可能出現類似底下的樣子

Linux(CentOS) -> Mac OS X(我的機器) -> Linux(Ubuntu)

常發生的問題就是無法讀取檔案,推測的原因是跟SELinux有關,簡單講就是檔案除了本身權限,有些支援SELinux的OS(如:CentOS)有另外的安全設定,以我的經驗來講Mac似乎是沒有或是關閉,所以若是下載完,用Mac做tar,然後再放上有開啟SELinux的主機中,然後untar,就會發生Apache無法讀取,但權限卻沒問題的狀況,最好的方法是一個個檔案上傳,系統會自行建立相關的資訊,就不會有這問題了,但另外的問題就是傳很久.....

2015年6月24日 星期三

定義jQuery的change、click等event的function時,能傳入參數

一般在使用jQuery的click或change等事件定義時,我總會使用如下的方式:

$('#target').change(function(){
    //執行想要的程式
});

若是有n個,我都會很偷懶的複製n次,在這行業混了十來年,這做法一直沒變,很少需要改(難怪有人講老狗玩不出新把戲 @@)

不過今天正好就遇到需要的狀況,兩個不同的target,要傳入的預設值不同,動作幾乎一樣,這樣定義兩次實在很蠢,所以查了下jQuery.change,截部分如下:

Description: Bind an event handler to the "change" JavaScript event, or trigger that event on an element.
看起來是change([資料], function),其中eventData帶入資料

所以如下使用
$('#targetA').change({target: 'A'},demo);
$('#targetB').change({target: 'B'},demo);

function demo(event){
    alert(event.data.target);
}

這樣由targetA啟動change就會alert出A,由targetB啟動change就會alert出B了

參考網址:
jQuery.change
How to use a function that takes arguments with jQuery's change() method?

2015年6月2日 星期二

Henplus下複製整個Table資料到新的資料庫

前陣子寫了Henplus下使用Alert Table,但想到最好是能下個SQL(使用Henplus的關係)直接複製整個table的資料,最好連建table都不用,看半天後沒想到真的有,只要利用SELECT INTO
henplus> select * into database_name.new_table from old_table;
affected 47186 rows (547 msec) //成功

這麼簡單就搞定建table及放入所有資料。

不過官網文字有個注意事項
WARNING! Be careful about running select into across databases if you have column names that exist in both databases, as this may cause problems.

另外,以官網Back Up Data to a New Table所記載,最好是先用sp_spaceused查詢下資料庫或資料表的使用空間,不過使用henplus只會看到如下的回覆文字,得使用DbVisualizer或其他方式吧,有發現再做更新。
sp_spaceused old_table;
affected 1 rows (50 msec)

注意事項:做這之前要先設定auto-commit為on,否則會一直出現FAILURE: The 'CREATE TABLE' command is not allowed within a multi-statement transaction in the 'xxxx' database.
henplus>set-session-property auto-commit on;

參考網址:
Back Up Data to a New Table
SQL SELECT INTO 语句

2015年6月1日 星期一

強制刪除目錄下特定名稱的檔案或目錄

今天處理個舊專案,原本是用svn,現在要改用git,要先將每個目錄下原關於svn的目錄都刪除掉,以前都傻傻一個個刪除,想想沒有這麼笨吧,找了下相關資料,只要使用底下的shell script即可搞定

cd 你的目錄
find . -type d -name '.svn' <--先確認檔案
find . -type d -name '.svn' | while read f;do rm -rf "$f"; done <-- 全部強制刪除

這樣就ok了,若要刪除檔案,type後的d就改成f

參考網址:
Linux: remove file extensions for multiple files

2015年5月24日 星期日

Log4j deploy error: log4j:WARN No appenders could be found for logger

今天在處理一個很舊很舊的Tomcat案子時,因為一時手滑,弄丟了所有的設定,將備份的放進去後,一直發生底下的error

資訊: Deploying web application directory TEST
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
2015/5/23 下午 03:19:43 org.apache.catalina.core.StandardContext start
嚴重的: Error listenerStart
2015/5/23 下午 03:19:43 org.apache.catalina.core.StandardContext start
嚴重的: Context [/TEST] startup failed due to previous errors

總覺得很奇怪,從沒發生過這問題,google了下,看到這篇WARN No appenders could be found for logger的解决方法,有點半信半疑下將web.xml中跟log4j的設定都
org.springframework.web.context.ContextLoaderListener前後再start,就真的正常了,用了快十來年的J2EE,我還真的第一次遇到這問題,再不然就是之前從來沒記錄過吧,哈哈哈

參考網址:
WARN No appenders could be found for logger的解决方法

2015年5月18日 星期一

Henplus下使用Alter Table

因為連接sybase的環境只有文字介面,所以使用henplus來操作,不過這次想要新增個欄位,執行了底下的sql後
henplus> alter table test add specs char(2) null;

卻一直出現底下的訊息:
FAILURE: The 'ALTER TABLE' command is not allowed within a multi-statement transaction in the 'db' database.

查了半天,看不出所以然來,似乎跟transaction有關,想到henplus預設auto-commit是off,於是執行了底下的指令
henplus>set-session-property auto-commit on;

用底下的指令查一下設定,只要看到on就成功了
henplus>set-session-property
-----------------+----------------+-----------------------------------------------+
      Name       |     Value      |                  Description                  |
-----------------+----------------+-----------------------------------------------+
 auto-commit     | on             | Switches auto commit                          |
 isolation-level | read-committed | sets the transaction isolation level          |
 read-only       | off            | Switches on read only mode for optimizations. |
-----------------+----------------+-----------------------------------------------+

再執行
henplus> alter table test add specs char(2) null;

回覆,這樣就成功囉~
ok. (13 msec)

=====2015/6/2 新增======

若是要改變column name,使用rename column一直無法成功,只能使用sp_rename這個內建函式,使用方式如下
henplus> sp_rename 'test.specs', 'test.specs2';

回覆如下就成功了
affected 1 rows (119 msec)

=====2015/6/2 新增======

=====2015/6/9 新增======

使用Henplus下複製整個Table資料到新的資料庫所提及的複製方式會有個問題,就是primary key無法跟著複製過去,所以要再加上primary key可以用底下的sql
henplus> alter table test add primary key (id);

=====2015/6/9 新增======

參考網址:
Adaptive Server Enterprise 15.7 > Reference Manual: Commands > Commands > alert table

2015年5月14日 星期四

清除Facebook Open Graph快取及測試Facebook分享的畫面

一般在沒有申請Facebook API的情況下,只是做分享都會用使用https://www.facebook.com/sharer.php?u=<你的link>這樣的方式來分享網址,但若是在實作過程中先測試過了,會造成Fabcebook將其cache畫面及資料,即使之後再加上og:xxx之類的meta,也無法更動內容,這時可以先到https://developers.facebook.com/tools/debug/



填入你的網址後,就會類似下圖:


這邊看來og:type沒加上,我再加上<meta property="og:type" content="website"/>,再按下“Fetch new scrape information”,就成功了,處理好後會發現cache內容也被更動了

另外,Debug過程發現og meta的順序如下:
type -> url -> title -> images

這樣就可以使用https://www.facebook.com/sharer.php?u=<你的link>來做些細節的調整了

參考網址:
Facebook Open Graph not clearing cache
og:image Open Graph Warnings image size
https://developers.facebook.com/tools/debug/ (Debugger)
https://developers.facebook.com/tools/debug/og/object/

https://developers.facebook.com/docs/reference/opengraph/object-type/website/

The Open Graph protocol

2015年4月17日 星期五

安裝Cocos2D 3.x在Mac

最近想做點什麼,想到之前用過Cocos2D 2.x,不過一年沒用後,看來改變不小,不像以前直接安裝在xCode之中,看了半天MAC OSX INSTALLATION AND SETUP覺得有被誤導的狀況,看了Mac环境下Cocos2d-x开发环境完全指南cocos2d-x 3.x Mac环境下搭建, 创建Xcode项目Cocos2d-x 3.x 全平台新手开发配置教程才ok,大致步驟如下:
  1. 安裝Xcode
  2. 下載Cocos2d 3.x(http://www.cocos2d-x.org/download/)
  3. 將下載檔複製到你要的目標,解壓縮(如:我下載cocos2d-x-3.5,解壓縮後出現cocos2d-x-3.5的目錄
  4. 執行目錄裡的setup.py
  5. 執行"source ~/.bash_profile"
這樣就完成了,要新建一個Proejct,只要開terminate.app,執行底下script,就會多出一個Xcode project可以用了
cocos new 專案名稱 -p com.你的名稱 -l cpp -d 目錄路徑 


參考網址:
Mac环境下Cocos2d-x开发环境完全指南
Cocos2d-x 3.x 全平台新手开发配置教程
MAC OSX INSTALLATION AND SETUP
cocos2d-x 3.x Mac环境下搭建, 创建Xcode项目
How can I include cocos2d-x templates in Xcode?

2015年3月14日 星期六

Javascript學習筆記- change value in IE 7

最近一個案子,因為蠻在意IE的舊版本,如:IE 7。在select中常會使用change再載入另一個select的值,如市及區的連動。但在IE 7發現有個狀況,可以看到下圖的按鈕重疊在上頭。

一開始以為這部分主要是設計師在css上的處理方式有問題,將select的寬度做了固定,而資料的長度又會變動,但後來發現,可能是在處理change event的方式直接使用jquery的change function,而它並沒有相容到ie使用的(如:propertychange | onpropertychange eventonpropertychange event | propertychange event所述)

所以使用上為了能相容,所以改用成底下的方式:
$('#object').bind('propertychange change', function (e) {
   //實際要執行的code   
   $(this).blur();
});

其實在使用上有發現,即使加入了propertychange,可能沒效果,但其實只要滑鼠點擊其他元件就正常了,所以可以看到上述程式加入$(this).blur(),來達到這個效果,這樣就ok了

參考網址:
propertychange | onpropertychange event
onpropertychange event | propertychange event

2015年2月20日 星期五

iOS開發筆記 - What is ObjC

之前老是在Other linker flags設定-ObjC,總是不大懂為什麼,查了下,在Technical Q&A QA1490 - Building Objective-C static libraries with categories中提到如下:

The -ObjC Linker Flag

Passing the -ObjC option to the linker causes it to load all members of static libraries that implement any Objective-C class or category. This will pickup any category method implementations. But it can make the resulting executable larger, and may pickup unnecessary objects. For this reason it is not on by default.
看起來簡單的解釋是:要載入其他用Objective-C寫的靜態library,要設定這個flag。而這個flag也有造成執行檔肥大的問題。

這倒讓我想到那有可能不用這個設定嗎???

參考網址:
What does the -ObjC linker flag do?
Technical Q&A QA1490 - Building Objective-C static libraries with categories

2015年2月18日 星期三

不錯的字型

http://free.com.tw/input-fonts

照著做就好 XD

取得使用者目前的時區

最近一個網站的對象是整個美國,加上有每日記錄的問題,發生了使用者在同一個做記錄,卻沒多久就變隔一天的窘境,查了半天看起來strtotime預設用的是UTC,除非特別寫進去要parser的字串中或設定php.ini,但重點在我不能固定在一個時區,歸納了有底下幾個需求
  1. 要取得使用者目前所在的時區
  2. 要能使用者各自有各自的時區
  3. 使用者之間不能互相影響
PHP 5.3.x 的 strtotime() 時區設定 警告訊息修正這篇可以知道,改時區大概有兩種種方式(其實不只)
  1. php.ini中設定date.timezone
  2. Function: date_default_timezone_set
這邊合乎需求的是date_default_timezone_set。試用過後,發現只有在設定後才會有效果。http呼叫重新來過時,又是用系統設定,不會互相影響。

再來要取得目前使用者時區,看了不少方式,都是取得目前系統時間再做差異比較,不過這方式很多細節要處理,最後找到這個jsTimezoneDetect,很容易使用,程式碼如下:

var timezone = jstz.determine();
function get_user_timezone(target)
{
    if( target != null && target.length != 0 )
        target.val(encodeURI(timezone.name()));
    return timezone.name();
}

要注意的是,不能在function中使用,宣告的變數要在最外頭,也不能放在jQuery.ready裡頭,jstz才可以存取到。

這樣就可以利用get_user_timezone取得時區名稱,如:Asia/Taipei。jstz會幫忙做轉換,也會計算日光節約時間等,省掉不少麻煩。

相關函式庫:
jsTimezoneDetect
tamaspap/timezones
jquery.detect_timezone


參考網址:
How to get client's timezone?
Get user's timezone using javascript/jQuery and PHP
PHP5 time zone solution
Auto-detecting user's timezone
List of Supported Timezones
Getting the Time Zone from a Web Browser
Detect user timezone using javascript
How to initialize javascript date to a particular timezone
Generating a drop down list of timezones with PHP

IANA - Time Zone Database

Date/Time based on user's location

查詢時間、請輸入國家、地區或主要城市的中文或英文名稱
Time Zones

2015年2月16日 星期一

Javascript學習筆記-Go back and reload

最近有個狀況,就是使用Ajax後,Browser似乎只會cache舊資料,Ajax成功後所更新的並記在sessoin或cookie的資料,要reload才會被cache住,這造成網頁資料的問題,尤其是買賣時的comfirm後,又按”回上一頁”按鈕,網頁上的資料有問題,最後做了個結論

  • 要能夠按下”回上一頁”按鈕後,網頁要能reload

得到這個網址的解決方案:How to refresh page after clicking "Back" button??

大概的解決方式是

  1. 設定hidden參數,預設為no
  2. 有參數更動時要設定參數為yes
  3. 在onload時檢查hidden參數是否為yes

Code如下:
<input id="refreshed" name="refreshed" type="hidden" value="no" />
<script>
onload = function () {
    var e = $('#refreshed');
    if (e.val() == 'yes') {
        e.val('no');
        location.reload();
    }
};
function set_reload() {
    $('#refreshed').val('yes');
}
</script>

需要設定為yes時,就call set_reload。

蠻簡單的變形,想像力果然才是限制 @@

參考網址:
How to refresh page after clicking "Back" button??