2011-11-07

好玩的javascript

寫不出甚麼技術文章…所以就玩玩網路上的東西…

一個好玩的javascript…(不知道怎麼命名…),

使用d3.js所作的互動式點陣圖效果…

官網 : http://koalastothemax.com

網址 : sample

koalastothemax

網頁上的source code有改圖的說明.

要改用你自己的圖的話,只要先將你的照片放在網路上.

然後瀏覽 http://koalastothemax.com?<你的圖片網址>

就可以了.

或是將網址用base64邊碼

http://koalastothemax.com?<your image url in base64>

如果你直接用網址的話,他也會幫你轉換成base64的邊碼.

2011-08-19

[C#]動態設定型態

前言

有個需求,需要從設定檔中取得型態的字串與值,然後在程式中將字串轉換為指定的型態.

如果看文字描述還是不清楚的話,可以看一下下面的範例.

假設xml設定檔中有個如下的設定

<Option Type="System.Int32">88</Option>
<Option Type="System.Drawing.Color">255,255,255</Option>

現在希望程式在執行時將設定轉換為指定的型態.

 

思路

其實我並不常玩reflection,所以對這並不很熟,

不過以這樣的需求,大概要做得的功能如下

1.get object type from string

2.convert type – convert string type to another type

(ps.用英文寫是因為以這樣的字串在google上搜尋比較容易找到可用的資料.)

 

針對第一點,有個

System.Type.GetType("System.Int32");

可以取得type,不過有個問題,如果你要的type不是System下的基礎的struct的話(在Mscorlib.dll裡),

就會回傳null.

像是System.Type.GetType("System.Drawing.Color");就會回傳null.

如果要取得System.Drawing.Color的話,你必須使用完整的assembly-qualified name,如下面這樣的寫法

System.Type.GetType("System.Drawing.Color, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");

(ps.我用的是framework 4.0)

但如果設定檔中要寫Assembly Qualified Name實在是太麻煩了.

所以要換個方式,從現有的assembly中撈type,再轉換.

畢竟要轉換型態也是要有載入該型態的assembly才行

而要取得載入的assembly,可以用下面的語法

Assembly[] AssembliesLoaded = AppDomain.CurrentDomain.GetAssemblies();

然後只要從這裡面撈我們要的type就可以了.到這,第一點也差不多解決了.

 

針對第二點.

有個TypeConvert.ConvertFromString可以處理.

TypeConverter converter = TypeDescriptor.GetConverter(typeOf(System.Int32));
return converter.ConvertFromString(inValue);

 

解決方案

整理一下上面的code就變成下面這個method了.

public static Object TypeConvert(string typeName, string inValue)
{
    Assembly[] AssembliesLoaded = AppDomain.CurrentDomain.GetAssemblies();
    Type trgType = AssembliesLoaded.Select(assembly => assembly.GetType(typeName))
        .Where(type => type != null)
        .FirstOrDefault();
    TypeConverter converter = TypeDescriptor.GetConverter(trgType);
    return converter.ConvertFromString(inValue);
}

ps.上面這個method只是一個簡單的範例,因為還沒有加上一些例外判斷.

還有也需要考慮到如果assembly未載入的話需要有動態載入的機制.

參考網頁

Type.GetType Method (String)
http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx

Show all assemblies loaded by your C# program
http://www.dijksterhuis.org/show-assemblies-loaded-program/

Convert or TryParse from string to T (generic) possible? work around?
http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/d3a139b0-9c14-400d-94f9-440b64a0122a/

How can I get System.Type from "System.Drawing.Color" string
http://stackoverflow.com/questions/944519/how-can-i-get-system-type-from-system-drawing-color-string

2011-07-14

[IIS issue]一個奇怪的問題…0x800710D8

現在的網站是用IIS7.5,因為有多台,所以使用Shared Configuration來設定,

一開始是在某一台設定完後匯出,然後改成啟用shared configuration,

到這,一切還沒有甚麼問題.

直到今天,想要加一個application pool,新增完後,哪個新的app pool卻沒辦法啟動,

按執行只出現下面的訊息

IIS7_5_error

iis forum上搜尋了一番,找到一個可以暫時解決的方法.

就是將主機上的"Windows Process Activation Service"重啟.
(每台主機都要重啟…)

重啟後,剛剛建好的app pool就可以啟動了.

不過目前還沒找到root cause跟根本的解決方法…

2011-07-12

修改Chrome的user agent設定

firefox中有個user agent switcher可以方便改變user agent.

雖然在chrome中也有個extension – User-Agent Switcher,

不過他似乎只有改navigator.userAgent,並不是直接改browser丟出去的header.

其實,在google chrome中,要改user agent的話,只要在啟動時設定--user-agent的參數就可以了.

範例如下:

C:\Users\*youraccount*\AppData\Local\Google\Chrome\Application\chrome.exe --user-agent="mozilla/5.0 (linux; u; android 2.3.3; en-us; sdk build/ gri34) applewebkit/533.1 (khtml, like gecko) version/4.0 mobile safari/533.1"

chrome-user-agent

但是,記得改完後一定要將所有的chrome視窗都關掉在重開才行.

開啟後可以在網址列輸入 about: 確認一下是不是正確的.

2011-07-06

[KB]遠端桌面連window vm時只有黑色螢幕

前言

因為需求,所以會建一些vm的環境來共同開發,而最近,有一台vm不知怎麼了,
用遠端桌面連指出現黑色畫面,但是一些服務看起來都很正常,
在另一台主機上透過服務的主控台都還可以去設定那些服務.
連線它的資料夾也都沒問題.
就只有遠端桌面一片漆黑.也看不到登入視窗.

解決方式

在網路上搜尋了一下,看來似乎是跟改了windows color scheme的關係.
(雖然已經忘了是不是有改過,不過改完後確實就可以用了…)

  1. 在另一個相同作業系統中匯出下面路徑的registry.(匯出預設的設定)
    [HKEY_USERS\.DEFAULT\Control Panel\Colors]
  2. 使用Registry編輯器連線到有問題的主機.
  3. 將剛剛匯出的設定,匯入到有問題的主機.
  4. 重該有問題的主機.(可以使用shutdown的指令去重啟遠端的主機,例 : shutdown /r /m \\remote-server)
  5. 等待重開機,完成!

參考網頁:

Black screen in a Windows VM or an a physical server

2011-03-23

[MSSQL]兩個insert的語法

1.將view或是tableB的資料匯到table A


insert into tableA (field1,field2,field3)
select F1,F2,F3 from
tableB
where F4=0

這個方式之前就有了,在這只是記錄一下.

 

2.insert大量資料 (new feature of SQL 2008)


insert into tableA (field1,field2,field3) 
values
('xxxa','xxxxb','xxxxc'),
('xxxa','xxxxb','xxxxc'),
('xxxa','xxxxb','xxxxc'),
('xxxa','xxxxb','xxxxc')


這個是SQL 2008的新功能.


不過用這樣的語法,一次最多只能新增1000筆.


如果要一次新增更多,可以使用BULK INSERT.


 


參考資料:


SQL SERVER – 2008 – Insert Multiple Records Using One Insert Statement – Use of Row Constructor
http://blog.sqlauthority.com/2008/07/02/sql-server-2008-insert-multiple-records-using-one-insert-statement-use-of-row-constructor/


BULK INSERT to table with specific columns
http://beyondrelational.com/blogs/madhivanan/archive/2010/03/17/bulk-insert-to-table-with-specific-columns.aspx

2011-03-22

[tip]IIS 7.5 備份及還原

IIS 6的主控台有介面可以備份跟還原IIS的設定,

但是在IIS7之後那個UI的介面就已經從IIS主控台中被拿掉了.

新的介面則變成匯出設定檔跟啟用共享設定檔(不過共享設定檔是比較好用的方式,下一篇再來說匯出跟共用的部分).

所以如果要執行IIS 7.5的備份跟還原的話可以透過下面的指令的達成.

 

在主機上的%windir%\system32\inetsrv\資料夾中有個appcmd的指令.

可以透過這個指令來操作IIS的備份跟還原

 

顯示目前所有的備份

appcmd list backup

新增一個備份

appcmd add backup 備份檔名稱

備份還原

appcmd restore backup 備份檔名稱

刪除備份檔

appcmd delete backup 備份檔名稱

顯示備份指令的參數說名

appcmd backup /?

 

IIS在每次更動後會自動備份,在預設的情況下,備份的紀錄會保留最後10次,如果要增加保留的數量,

可以透過下列指令修改

appcmd.exe set config -section:system.applicationHost/configHistory /maxHistories:"50" /commit:apphost

 


自動備份的資料夾預設是在 %SYSTEMDRIVE%\inetpub\history 下.


而使用指令備份的資料夾則是存放在 %WinDir%\System32\inetsrv\backup


使用list的指令可以看到這兩個位置下的所有備份檔.






!!下面是針對要在不同機器上備份還原,不過實作上一直有問題,所以可以參考看看但不建議這樣做…


 


從ServerA備份的檔案直接複製到ServerB的%SYSTEMDRIVE%\inetpub\history下,


雖然list的時候可以看到這個備份檔,不過如果要restore的話,就會出現下面的錯誤訊息.



ERROR ( hresult:80070005, message:Command execution failed.Access is denied. )


所以要將備份檔放在%WinDir%\System32\inetsrv\backup下才行.


ps.使用appcmd的指令請用系統管理者的身分開啟command list的視窗再執行.


 


從Server A備份後要在Server B還原的時候,如果網站或是application pool有設定使用domain account存取執行的話,還原後應該會有問題,而在修改application pool或是網站存取帳號的時候應該會下面這錯誤.


IIS7_5


這個主要是因為備份的applicationHost.config中會儲存設定的帳號跟密碼,而密碼會透過設定檔中的key加密.


所以這時候這時需要將Server A上設定檔的key匯出,然後在Server B上還原,指令如下:



匯出(在Server A上執行)


aspnet_regiis -px "iisConfigurationKey" "C:\iisConfigurationKey.xml" -pri
aspnet_regiis -px "iisWasKey" "C:\iisWasKey.xml" –pri



匯入(在Server B上執行)


aspnet_regiis -pi "iisConfigurationKey" "C:\iisConfigurationKey.xml"
aspnet_regiis -pi "iisWasKey" "C:\iisWasKey.xml"


ps.不過這部分我在VM上執行一直有問題…所以後來是改用設定檔共享的方式…


 


參考資料:


How to backup/restore IIS7 configuration
http://blogs.iis.net/bills/archive/2008/03/24/how-to-backup-restore-iis7-configuration.aspx


Using IIS 7.0 Configuration History
http://learn.iis.net/page.aspx/129/using-iis-70-configuration-history/


Configuration History <configHistory>
http://www.iis.net/ConfigReference/system.applicationHost/configHistory


Caution while xcopying IIS 7.0 config files
http://blogs.msdn.com/b/webtopics/archive/2009/03/15/caution-while-xcopying-iis-7-0-config-files.aspx