網頁

2011年12月8日 星期四

Gae Web Service (Java)

Last Update: 2011/12/09 13:33+08
Type: Note

Intro

這只是一篇學習筆記
若看倌們對這個標題有興趣
可參考最下面的 Reference~

根據官方文章說法, GAE 不支援使用JAX-WS, 因此要自己用 wsgen, wsimport 來實作 Web Service.

步驟
1. 建立 Web Application Project
2. 建立 WebMethod (Web Service API)
3. 使用 wsgen 產生所需檔案
4. 產生可執行的實例


XCode Other

Debug Console

print
(gdb) print (void)CFShow(myCFString)
(gdb) po (NSString*)myCFString

2011年11月27日 星期日

OpenXML Simple Sample

Last Update: 2011/11/28 01:18+08


Intro

今次去客戶那學到了些東西!
就是這次的 OpenXML
常常都有客戶會要匯出 Word Report
過去寫這個只有麻煩, 要不直接拒絕
時代在變遷呀~囧
在 Word 2007 以後, 文件的內裡其實是XML Document
為了方便Programmer操作, 也釋出了OpenXML SDK
下面來介紹一些基本的使用



---Prepare---
Word 2007 up (廢話 XD)
OpenXML SDK (lib, tool)



---Step---
1. 建立Template
  • 開啟 開發人員(Developer) 頁籤
  • 插入 內容控制項(Content Control)
  • 檢視Word の Xml Document
2. Coding



Content


1. 建立 Template
從頭到尾用 Code 寫 Word 未免太累了
所以咱們要先建立Template

後面有用到 內容控制項
主要是為了在撰寫Code時
可以方便尋找我們要的位置
所以這是非必要的~

開啟 開發人員(Developer) 頁籤
為了在設計 Template 期間, 加入內容控制項
咱們需要先把開發人員的功能開啟來
檔案 => 選項 => 自訂功能區 => 勾選 開發人員


插入 內容控制項(Content Control)
如下圖所示
移到開發人員頁籤後, 點擊您想用的內容控制項, 就完成加入的動作了.
為了待會方便搜尋, 咱們 再來點選屬性, 輸入控制項別名(alias)
醬~ 咱們的Template就算完成了



檢視Word の Xml Document
請把Word的衣服脫了!!!
喔不, 請直接對Word點右鍵, 解壓縮!!!
如果沒這個選項, 就請先把副檔名改成 ".zip"
您會看到它的檔案結構
請開啟 word/document.xml

您可以稍微看一下內容
但其實不用太瞭解結構
之後用Code操作, 只要針對Template的長相去寫Code就好了
這邊就不廢話, 反正寫了就會瞭解


2. Coding
首先就是加入參考啦
如果沒有安裝Tool的
請到 OpenXML 安裝目錄下找 DLL 引入
有安裝的直接按加入參考選 DocumentFormat.OpenXml
另外是有可能會叫你加入 WindowsBase.dll 的參考, 就照做唄

再來就是Code
寫Code前先看一下 Word 的 Xml Document


咱們的 <w:alias ... /> 的上一層是 <w:sdtPr>
應該是Parameter的意思
同層的 <w:sdtContent> 底下的 <w:t>, 就是咱們要的
所以可以醬寫~
using (var wdDoc = DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Open("HelloOpenXML.docx", true)){
    //因為是Template, 所以不會為null
    var doc = wdDoc.MainDocumentPart.Document;
    //尋找所有別名(alias)
    var alias = doc.Descendants<DocumentFormat.OpenXml.Wordprocessing.SdtAlias>();
    foreach (var loop in alias){
        switch (loop.Val.Value){
            case "user_name"://若是 user_name
                //取得文字物件
                var text = loop.Parent.Parent
                    .Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>()
                    .FirstOrDefault();
                //取代原文字
                text.Text = "Your Name";
                break;
        }
    }
}

The End...


Reference

Creating Content Controls

2011年9月23日 星期五

dotNet Dynamic Compile Code

Last Update: 2011/09/23 16:51+08

Intro

動態編譯程式碼!!
並不是動態產生程式碼!!
目的請各位看倌自行應用
小弟是讓使用者可以自己輸入折扣/特價

底下會分幾段
1. Dynamic Compile Code
  a. Compiler Parameters
  b. Code
  c. Compile
  d. Run
2. Sample Code


Content


1. Dynamic Compile Code
底下為動態 Compile Code 並執行的方法
一開始要創建 Code Provider, 用來Compile
static object RunCode(string code){
    var provider = Microsoft.CSharp.CSharpCodeProvider.CreateProvider("C#");

    /*---Compiler Parameters---*/
    var compilerParams = new System.CodeDom.Compiler.CompilerParameters();
    compilerParams.ReferencedAssemblies.Add("System.dll");
    compilerParams.GenerateExecutable = false;
    compilerParams.GenerateInMemory = false;


    /*---Code---*/
    System.Text.StringBuilder fileCode = new StringBuilder();
    fileCode.Append("using System; \n")
        .Append("public class TestDynCode{")
            .Append("public object Run(){")
                .Append(code)
            .Append("}")
        .Append("}");


    /*---Compile---*/
    var compilerResult = provider.CompileAssemblyFromSource(compilerParams, fileCode.ToString());
    if (compilerResult.Errors.HasErrors){
        System.Text.StringBuilder error = new StringBuilder();
        foreach (System.CodeDom.Compiler.CompilerError err in compilerResult.Errors)
        { error.AppendFormat("{0}\n", err.ErrorText); }
        throw new Exception("Error Compiling Expression: " + error.ToString());
    }

    /*---Run---*/
    System.Reflection.Assembly assembly = compilerResult.CompiledAssembly;
    var obj = assembly.CreateInstance("TestDynCode");
    return obj.GetType().GetMethod("Run").Invoke(obj, null);
}

大致可以分為 4 段
跟我們平常開發的方式差不多

a. Compiler Parameters
先設置參數, 包含要加入參考的 Lib
和 Compile 環境等等參數

b. Code
開始寫Code, 內容跟平常寫Code一樣, 只是變成字串
這邊為了方便, 已經寫好 class 和 method 名稱
使用時, 只要傳來裡面的 Code

c. Compile
Compile (Build)
寫好Code當然就直接Compile看看能不能過了
可以從 compilerResult 這物件去取得 Compile Error

d. Run
取得它Compile好的Assembly
創建物件實體, 最後 Invoke Method

動態編譯Code大概就醬


2. Sample Code
這裡稍微寫一小段測試的Code
GetTotalPrice: 給價格 和 數量 算總價, 裡頭暫時寫死了計算規則
Main: 呼叫 GetTotalPrice 列出結果
static void Main(string[] args){
    Console.WriteLine(GetTotalPrice(10, 9));
    Console.WriteLine(GetTotalPrice(10, 4));
    Console.ReadKey();
}

static object GetTotalPrice(decimal price, int count){
    string inputRule = "return [數量] > 5 ? [價格] * [數量] * 0.9 : [價格] * [數量];";//賣方Input

 //實際要Run的Code
    string realInputRule = inputRule
        .Replace("[數量]", count.ToString())
        .Replace("[價格]", price.ToString());
    return RunCode(realInputRule);
}

感謝各位看倌賞臉~

2011年9月15日 星期四

XmlWriter encoding

Last Update: 2011/09/16 13:44+08

Intro

使用 XmlWriter 需要設置 Encoding 時發生的問題


Content

基本的用法是醬~
var buffer = new StringBuilder();
using (var write = System.Xml.XmlWriter.Create(buffer)){
    write.WriteStartElement("Transaction");
    write.WriteAttributeString("Action", "AskData");
    write.WriteEndElement();
}

如果要加一些參數的話, 就得設置 XmlWriterSettings
var buffer = new StringBuilder();
var setting = new System.Xml.XmlWriterSettings();
setting.Indent = true;
setting.Encoding = new System.Text.UTF8Encoding();
using (var write = System.Xml.XmlWriter.Create(buffer, setting)){
    write.WriteStartElement("Transaction");
    write.WriteAttributeString("Action", "AskData");
    write.WriteEndElement();
}

然後咱們就會發現, Indent 有作用, 但 Encoding 還是 utf-16


這是由於 dotNet 的字串本身就是utf-16編碼
所以咱們需要把 buffer 改成 Stream
var buffer = new System.IO.MemoryStream();

如果看到了如下圖的字串, 開頭有一段不明所以的空白

就是你得到了!! utf-8 的前置識別字元~請把它取消掉~

最後的Code就長醬~
var buffer = new System.IO.MemoryStream();
var setting = new System.Xml.XmlWriterSettings();
setting.Indent = true;
setting.Encoding = new System.Text.UTF8Encoding(false);//取消前置識別字元
using (var write = System.Xml.XmlWriter.Create(buffer, setting)){
    write.WriteStartElement("Transaction");
    write.WriteAttributeString("Action", "AskData");
    write.WriteEndElement();
}

2011年8月29日 星期一

MSMQ Sample

Last Update: 2011/09/22 12:40+08


Intro

MSMQ Sampe!!
Listen 方法2種
1. Receive - 接到就刪
2. Peek - 接了不刪
這邊就只寫Receive的
遠端測試是可行的~

咱只用私用佇列(Private$)
公用佇列(Public$)需要在有AD的環境

下面會提到
1. Message Queue
2. 交易式 Message Queue


Content

1. Message Queue
接收方法/接收完成的事件
包含了重複的 Listen
private void btnReceive_Click(object sender, EventArgs e){
    var mqPath = @".\Private$\MqTest";
    if (!System.Messaging.MessageQueue.Exists(mqPath))
    { System.Messaging.MessageQueue.Create(mqPath); }

    var msgQueue = new System.Messaging.MessageQueue(mqPath);
    msgQueue.ReceiveCompleted += new System.Messaging.ReceiveCompletedEventHandler(msgQueue_ReceiveCompleted);
    msgQueue.BeginReceive();
}
void msgQueue_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e){
    var msgQueue = sender as System.Messaging.MessageQueue;
    var msg = msgQueue.EndReceive(e.AsyncResult);//suspend and get message
    msg.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
    LogRecorder.Log(msg.Label + "\n" + msg.Body);//Display
    msgQueue.BeginReceive();//Repeat Listen
}

Send方法~
private void btnSend_Click(object sender, EventArgs e){
    var mqPath = @"FormatName:Direct=TCP:192.168.1.30\Private$\MqTest";
    //var mqPath = @".\Private$\MqTest";//if local test
    var msgQueue = new System.Messaging.MessageQueue(mqPath);
    msgQueue.Send("Message Content", "Message Label");
}
就醬!!


2. 交易式(Transaction) Message Queue
要在創建 Message Queue 註明為交易式的Queue, 如下
System.Messaging.MessageQueue.Create(mqPath, true);
手動建立的話, 請至
控制台/系統及安全性/系統管理工具/電腦管理
=> 系統工具/服務與應用程式/訊息佇列/私用佇列
=> 右鍵 新增
=> 勾選 "交易式"


Receive 方法一樣
這邊講一下 Send 方法
private void btnTranSend_Click(object sender, EventArgs e){
    var mqPath = @".\Private$\MqTranTest";
    var msgQueue = new System.Messaging.MessageQueue(mqPath);
    var mqTran = new System.Messaging.MessageQueueTransaction();
    mqTran.Begin();
    msgQueue.Send("non-transaction body", "non-transaction label");//沒有transaction的不會被同意
    msgQueue.Send("transaction body", "transaction label", mqTran);
    mqTran.Commit();

    //可做一次性交易, 自動beginl, commit
    msgQueue.Send("single transaction body", "single transaction label", System.Messaging.MessageQueueTransactionType.Single);
}

End~

Reference

公用佇列需要 工作電腦在AD環境中
http://technet.microsoft.com/zh-tw/library/cc776346(WS.10).aspx

2011年7月1日 星期五

Python Config Yaml File

Last Update: 2011/07/01 17:32+08
Type: Note


• Static Page/File and so on:

- url: /common/menu.html
static_files: common/menu.html
upload: common/menu.html



• Static Directory

- url: /css
static_dir: css



• Script

- url: /product
script: script/product.py



• Extension/Regular on one directory
\1 : url 的 regular

- url: /(common/.*\.(html|png))
static_files: \1
upload: (common/.*\.(html|png))

#Rewrite Path
- url: /(.*\.(html|png))
static_files: common/\1
upload: common/(.*\.(html|png))

2011年6月27日 星期一

Asp.net View & Edit Mode on Control

Last Update: 2011/06/27 17:11+08

Intro


廢話少說XD,網頁就是要不斷 Add/Edit/View...
明明同一個Layout為何要做一個編輯, 一個檢視咧.
基於這個想法, 就試著做一個切換方式吧!!
重點在 override Render


Summary


1. 建一個interface IViewEditControl 讓控制項有共同 function
2. 繼承原生控制項, 實作咱們的interface, 並覆寫Render
3. 切換模式吧!!


Context



2011年6月22日 星期三

Asp.net GridView Binding Time

Last Update: 2011/06/22 16:17+08

Intro

綁定時機算是挺重要的, 相信大家在寫GridView都曾遇到過
(1) Edit mode 指定到上一次的Row.
(2) 可能有部份人會遇到, 在Page_Load裡做綁定的動作, RowCommand 會壞掉
咱也曾經歷過
咱最近又常trace到這類的Code
咱決定閒來沒事寫給各位看倌們參考
請在 Page_PreRender 執行 this.DataBind()

Content

這是咱們的GridView
<asp:GridView ID="gvList" runat="server" OnRowEditing="gvList_RowEditing">
  <Columns><asp:TemplateField>
    <ItemTemplate>
      <asp:Button ID="btnEdit" runat="server" CommandName="Edit" />
    </ItemTemplate>
  </asp:TemplateField></Columns>
</asp:GridView>
這是咱們的Code
protected void Page_Load(object sender, EventArgs e){
    //if (IsPostBack) { return; }//*3
    var item = new[]{ 
            new { id = "i001", name="John"},
            new { id = "i002", name="Merry"},
            new { id = "i003", name="Ellin"}
        };
    gvList.DataSource = item;
    gvList.DataBind();//*1
}

protected void gvList_RowEditing(object sender, GridViewEditEventArgs e){
    gvList.EditIndex = e.NewEditIndex;
    gvList.DataBind();//*2
    Response.Write(e.NewEditIndex);
}
protected void Page_PreRender(object sender, EventArgs e){
    //this.DataBind();//*4
}
剛開始, 習慣上
咱過去也是會在指定完 DataSource 後, 直接執行DataBind() ---(*1)
但是就會遇到第一個問題
a. 在gvList_RowEditing 指定完 GridView.EditIndex, 頁面總是顯示上一次點擊的Row
相信大家早已知道解決方法: 在指定完後 Bind ---(*2)

再來
b. 傳說中 "無效的回傳或回呼引數" 就出現了
當然在請教咱們偉大的古狗大神, 一下就得到了解答
RowEditing事件, 在重新綁定後, 原本的Row就消失了
所以加入了 ispostback 判斷 ---(*3)

再來
c. postback沒有指定DataSource, 資料就消失了, 那就合併 (*1) 跟 (*3) ...

還有啥問題盡管來吧!! 醬的感想就出來了!!
不不不, 其實 DataBind 不是醬用的!!!
如果指定完 DataSource 就 Bind
那咱們要 DataBind 這樣的 function 有啥用
是不是想到啥東西了XD
對, 就是在 Render 以前綁定就可以了, 也就是 PreRender
而 this.DataBind(), 會幫你把所有子控制項都執行DataBind()
好了, 把 (*1)、(*2)、(*3) 都拿掉吧!!
解除(*4)的封印註解!!!
啊, 這可不是通用法則

2011年6月16日 星期四

Asp.net Button PostBack use OnClientClick

Last Update: 2011/06/22 16:08+08
更新~ 加入ValidationGroup

Intro


目標是
1. Confirm before PostBack
2. Validator working

Context


這大概沒啥技術性, 就是要找怎麼用
重點在
GetPostBackEventReference: 取得PostBack函式
Page_ClientValidate(string ValidationGroup): 執行頁面驗證, 會回傳成功與否
Page_IsValid: 驗證狀態 (這大概是個Flag可以不用)

根據這些去拼出 JavaScript
最後的 return false 是避免自動PostBack
不知道誰呼叫了 onclick, 如果沒回傳false仍舊會PostBack


public static void ClickSendValidConfirmDisabled(System.Web.UI.Page page, System.Web.UI.WebControls.WebControl ctrl, string confirmText){
 string clientScript = ctrl.ClientID + ".disabled='disabled';" + page.ClientScript.GetPostBackEventReference(ctrl, null) + ";";

 bool needValid = false;
 string validationGroup = null;
 if (ctrl is System.Web.UI.WebControls.IButtonControl){
  System.Web.UI.WebControls.IButtonControl ibtnCtrl = ctrl as System.Web.UI.WebControls.IButtonControl;
  needValid = ibtnCtrl.CausesValidation;
  validationGroup = ibtnCtrl.ValidationGroup;
 }

 clientScript = "if(confirm('" + confirmText + "')){" + clientScript + "}";

 if (needValid){ clientScript = "if(Page_ClientValidate('" + validationGroup + "')){" + clientScript + "}"; }

 ctrl.Attributes["onclick"] = clientScript + "return false;";
}

2011年5月29日 星期日

Oracle Import/Export

Last Update: 2011/05/30 10:10+08
Type: Note

Preface


久久用一次, 就老是忘記, 還是寫在自己的Blog



Content


Service_Name= 服務名稱(類似Sql Server 執行個體名稱)
Tablespace = 表格空間(類似資料庫)

底下的匯入將導入該使用者的預設表格空間
所以, 如果不想放到system, 就自己開一個使用者指過去吧:)
剛好也得為專案開一個使用者呀

Import
imp <User ID>/<Password>@<Service_Name> file=<File Path> full=y
ex: imp myuser/mypassword@orcl file=D:/mydb.dmp full=y

Export
exp <User ID>/<Password>@<Service_Name> file=<File Path> full=y

2011年5月24日 星期二

SqlServer Util Command

Last Update: 2011/06/16 11:06+08



---取得連線資訊---------------------
Use master
Select * From sysprocesses


---Foreach table------------------
Use []
--請注意唷, 下面指令會刪除All table
Exec sp_MSforeachtable @command1 = "DROP TABLE ?"


---Limit---------------------------
select * from (select row_number() over (order by ac_id) as row_num,* from account)
t where row_num between 1 and 30

2011年4月30日 星期六

ActionScript - addEventListener, dispatchEvent

Last Update: 2011/05/01 13:28+08


Intro


關於 ActionScript 的 addEventListener / dispatchEvent
這2個 method 被定義在 EventDispatcher
因此咱們的物件只要有繼承到這個, 都可以使用

講到 dispatchEvent 通常就應該是自定義event了
不然用 addEventListener 就夠了唄


Listener / Dispatch



這是自訂的類別

public class MyTest extends EventDispatcher
{
public static const Event_UnknownComplete:String="MyTest.Event_UnknownComplete";
public function doEvent_UnknownComplete():void{
this.dispatchEvent(new Event(Event_UnknownComplete));
}
public function start():void{
setTimeout(doEvent_UnknownComplete,2000);
}
}



在Application的測試Code

protected function application1_creationCompleteHandler(event:FlexEvent):void
{
var test : MyTest = new MyTest();
test.addEventListener(MyTest.Event_UnknownComplete, test_Event_UnknownComplete, false);
test.addEventListener(MyTest.Event_UnknownComplete, function(event:Event):void{
Alert.show("Event_UnknownComplete be dispatched 2");
});
test.start();
}

protected function test_Event_UnknownComplete(event:Event):void{
Alert.show("Event_UnknownComplete be dispatched 1");
}

2011年3月31日 星期四

Asp.net控件屬性-字串包含字串

Last Update: 2011/03/31 20:52+08

最近常被同事問到這個問題

.net的控制項某個屬性要用字串
那個字串是javascirpt
那個javascript裡頭還有字串
第一個想法就是 單引號 包 雙引號 再包 單引號

沒錯!是不行的
屬性值用 單引號 後, 遇到下一個單引號就代表結束
但解法還是有的XD
把裡面單引號用html碼 (&#39;)代替

<%
System.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Name");
dt.Rows.Add("01", "John");
dt.Rows.Add("02", "Mary");
GridView1.DataSource = dt;
GridView1.DataBind();
%>

<asp:GridView ID="GridView1" runat="server"><Columns>
<asp:TemplateField><ItemTemplate>
<asp:HyperLink ID="hlEdit" runat="server" 
NavigateUrl='<%#"javascript:alert(&#39;"+Eval("id")+"&#39;);" %>'>
Edit</asp:HyperLink>
</ItemTemplate></asp:TemplateField>
</Columns></asp:GridView>

2011年2月17日 星期四

WinServer2008 & IIS & Excel - 無法存取檔案

Last Update: 2011/02/17 17:55+08



Context


完全是 Windwos Server 2008的錯!!!

如果你按照這篇設定完後仍然不能使用 Excel

又是使用 Server 2008, 那請在web.config 加入
<configuration>
<system.web>
<identity impersonate="true" userName="adminUser" password="adminUserPassword" />



OK, 還是不能使用
訊息:Microsoft Office Excel 無法存取檔案


若是 Server 2008 x64 請建立下述資料夾
C:\Windows\SysWOW64\config\systemprofile\Desktop

若是 Server 2008 x86 請建立下述資料夾
C:\Windows\System32\config\systemprofile\Desktop

這樣就可以了!!搞啥呀XD
感想: 軟體工程師 = 會一點程式 + 一點邏輯 + 在Google打關鍵字!




參考


原討論文

2011年2月6日 星期日

Excel 操作

Last Update: 2011/03/13 02:50+08


Intro


關於 Excel API 操作

◆ 如果單只是要匯出Excel表, 只要把副檔名設成xls
html(UI)就放個Table就好
反正Excel可以幫你轉換
Response.AddHeader("content-disposition", "attachment;filename=MyExcel.xls");


◆ 如果是要匯入資料的話, 用OleDb就可以了

◆ 如果有些格式, 公式 等等要求的話
還是得乖乖的用 Excel 的 API
下面就來講這塊


2011年1月15日 星期六

Basic Lights of Shader

Last Update: 2011/01/16 17:31+08


Intro


這篇是介紹Light
Demo是自製 WebGL 的常用/預設Shader。
如果你是用Visual Studio, IntelliSense可以Work.
>Download Demo
代碼在 glShader.js 裡


之前都是以達成目標為主,反倒是忽略了基礎得紮穩點。
前陣子去面試考題要說明 3 種 Light 和演算法
一紙筆, 才發現一時寫不出來(=_=a.
這次學 WebGL 就給它認真的來記一次,順便寫個筆記。


2011年1月4日 星期二

Linq & AnonymousType

Last Update: 2010/01/13 20:39+08


好物!!Linq搭配AnonymouseType
一整個像在寫JavaScript
DropDownList 想 綁定 2 個欄位?
想要暫時的struct卻要建一個?
看下去唄