posts - 19,comments - 15,trackbacks - 0
/Files/wangkang2009/gyp-master.rar

該下載文件里包含一個gyp的VC模板, gyp_template.gyp
包含一些常用的編譯器參數, 同時修改了gyp的源碼使vc2015支持xp v140_xp
posted @ 2018-12-12 15:48 wangkang 閱讀(22) | 評論 (0)編輯 收藏
git bash提交github
跟著網上的教程進行了一次github的提交, 發現中間還是碰到了一些問題, 因此再記錄一次
環境只針對windows
1. 安裝好git后不能直接使用git, 而是要使用git bash
2. 注冊好github并創建一個新的倉庫
3. 運行gitbash.bat, 產生一個類似cmd的窗口, 以下命令行全部在gitbash中執行
4. 產生ssh使用的公鑰
ssh-keygen.bat -t rsa -C "youemail"
默認產生在C:\Users\Administrator\.ssh
打開id_rsa.pub拷貝里面的內容到github里的ssh key里
驗證密鑰是否生效
配置git
git config --global user.name "youname"
git config --global user.email "youemail"
5. 用資源管理器創建一個空目錄作為代碼目錄, 例如c:\test
6. 下載代碼
cd c:/test
git init
git remote add origin [email protected]:youname/yourep.git
下載倉庫
git pull origin master
7. 在windows環境中把需要提交的代碼拷貝至test
8. 添加代碼,提交代碼
git add .
添加代碼或提交代碼時會跑出一個vim界面, 用:q退出
git commit -m "first commit"
這里必須要寫注釋, 不寫提示 aborting commit due to empty commit message
git push -u origin master
這里開始出現上傳的百分比, 100%后代碼提交成功
9. github頁面刷新, 可以看見提交已經生效
posted @ 2017-02-05 16:51 wangkang 閱讀(65) | 評論 (0)編輯 收藏
簡單說下步驟吧
1. 需要收集分紅送股的數據, 姑且稱之為分紅表,給一個例子
600617的分紅表, 股數,現金,除權日
   0     1           2
0  7     0  2015-04-20
0  0  0.26  2001-07-19
0  0   0.2  2000-08-24
0  0   0.4  1998-07-29
0  0  0.38  1996-06-25
0  2   1.5  1995-05-31
0  0     3  1994-06-06
2. 當然需要有日k線數據, 轉換為pd.DataFrame格式, 最高價最低價等對應的col名稱為ohlcv
3. 根據除權數據, 按倒序來復權, 就是先復權日期早的
def calc_fuquan_use_fenhong(df, df_fenhong):
    """獲取復權后的歷史數據, 用分紅表來計算復權 , 前復權
    df: 日k線
    df_fenhong: 分紅表
    return: df
"""
    #日期早的在前面
    df_fenhong = df_fenhong.sort_index(by=2)
    for i in range(len(df_fenhong)):
    gu, money, date = df_fenhong.irow(i)
    if len(df.ix[:date]) < 2:
        continue
    date = agl.df_get_pre_date(df, date)
    if money > 0:
        money = money * 0.1
        df['o'].ix[:date] -= money
        df['h'].ix[:date] -= money
        df['c'].ix[:date] -= money
        df['l'].ix[:date] -= money
    if gu > 0:
        # x = cur / (1+y/10)
        gu = 1+gu/10
        df['o'].ix[:date] /= gu
        df['h'].ix[:date] /= gu
        df['c'].ix[:date] /= gu
        df['l'].ix[:date] /= gu
    return df        
4. 結果
                    o          h          l          c         v
2010-06-01   6.158824   6.458824   6.158824   6.158824   1922980
2010-06-02   5.941176   6.294118   5.941176   6.235294    837740
經過測試, 前復權結果與同花順,通達信的計算相同
posted @ 2015-04-25 09:28 wangkang 閱讀(1562) | 評論 (0)編輯 收藏
關鍵字: png bmp txt pil 

下面的代碼可以把圖像轉換成文本, 是從網上的一段程序改的, 本來是想在控制臺使用的, 但輸出的文本過大, 縮放過小又會造成像素丟失的情況。
先貼出來. 這個版本適用于文件輸出, 可以保持更好的顯示效果
from PIL import Image
import os
def PngToTxt(f):
    Palette={'000':'#'#榛?
    ,'010':'@'#鏆楃豢
    ,'020':'/'#緇?
    ,'001':'$'#娣辮摑
    ,'011':'<'#闈?
    ,'021':'"'#浜?豢鑹?
    ,'002':'='#钃?
    ,'012':'\\'#闂?摑鑹?
    ,'022':'_'#嫻呯豢
    ,'100':'>'#鏆楃孩
    ,'110':'*'#鏆楅粍
    ,'120':'~'#榛勭豢鑹?
    ,'101':'%'#鏆楃傳
    ,'111':'+'#鐏?
    ,'121':'^'#嫻呯豢鑹?
    ,'102':'|'#绱?綏鍏?
    ,'112':'!'
    ,'122':'-'
    ,'200':'&'#綰?
    ,'210':';'#姍欒壊
    ,'220':"'"#榛?
    ,'201':')'#娣辯矇鑹?
    ,'211':'.'#綺夌孩鑹?
    ,'221':'`'
    ,'202':']'#绱?
    ,'212':','
    ,'222':' '#鐧?
    }    
    img = Image.open(f)
    if 0: img = Image.Image
    #縮小, 結果比較模糊, 還是用原比例較好
    #img = img.resize((80,60))
    w,h = img.size[:2]
    print w,h
    result = []
    for i in range(h):
        result1 = []
        for j in range(w):
            pixel = img.getpixel((j,i))[:3]
            result1.append(Palette[''.join([str(int(x//85.3)) for x in pixel])])
        result.append(result1)
    r="\n".join(["".join(x) for x in result])
    print r
    object_file=os.path.splitext(f)[0]+".txt"
    open(object_file,'w').write(r)    



經過一些改進, 下面的代碼可以適用于控制臺輸出

def PngToTxt(f):
    Palette={'000':'#'#榛?
    ,'010':'@'#鏆楃豢
    ,'020':'/'#緇?
    ,'001':'$'#娣辮摑
    ,'011':'<'#闈?
    ,'021':'"'#浜?豢鑹?
    ,'002':'='#钃?
    ,'012':'\\'#闂?摑鑹?
    ,'022':'_'#嫻呯豢
    ,'100':'>'#鏆楃孩
    ,'110':'*'#鏆楅粍
    ,'120':'~'#榛勭豢鑹?
    ,'101':'%'#鏆楃傳
    ,'111':'+'#鐏?
    ,'121':'^'#嫻呯豢鑹?
    ,'102':'|'#绱?綏鍏?
    ,'112':'!'
    ,'122':'-'
    ,'200':'&'#綰?
    ,'210':';'#姍欒壊
    ,'220':"'"#榛?
    ,'201':')'#娣辯矇鑹?
    ,'211':'.'#綺夌孩鑹?
    ,'221':'`'
    ,'202':']'#绱?
    ,'212':','
    ,'222':' '#鐧?
    }    
    img = Image.open(f)
    if 0: img = Image.Image
    #縮小, 結果比較模糊, 還是用原比例較好
    img = img.resize((60,20))
    w,h = img.size[:2]
    #print w,h
    result = []
    for i in range(h):
        result1 = []
        is_empty_line = True
        for j in range(w):
            pixel = img.getpixel((j,i))[:3]
            #result1.append(Palette[''.join([str(int(x//85.3)) for x in pixel])])
            if pixel==(255,255,255):
                s = '222'
            else:
                s = '110'
                is_empty_line = False
            result1.append(Palette[s])
        #去除空行
        if is_empty_line == False:
            result.append(result1)
    r="\n".join(["".join(x) for x in result])
    print r
    object_file=os.path.splitext(f)[0]+".txt"
    open(object_file,'w').write(r)

圖例:


posted @ 2014-03-20 09:36 wangkang 閱讀(1292) | 評論 (2)編輯 收藏
關鍵詞: 用python仿造matlab發布報告, html

經常用matlab的人有時候會用到publish發布報告的功能, 也就是生成一個html的瀏覽頁, 而python中貌似就沒有這種功能。現在本人做了一個簡單的類似功能,大概的樣式如下:





雖然比較簡陋,但至少可以在瀏覽器中看了。

大概的原理是用發布類替換pl, 因此如果您的pl使用了較多的函數, 那么需要相應的在Publish中加入類似的代碼。

 1     def figure(self, id=1):
 2         pl.figure(id)
 3     
 4     def plot(self, *args, **kwargs):
 5         pl.plot(*args, **kwargs)
 6     
 7     def subplot(self, *args, **kwargs):
 8         pl.subplot(*args, **kwargs)
 9     
10     def title(self, s, *args, **kwargs):
11         pl.title(s, *args, **kwargs)
對于要發布的代碼, 只需要在前面加上Publish類就可以了
1 from pypublish.publish import *
1     #不發布把該行注銷
2     pl = Publish()
3     print 'test python html publish.'
4     for i in range(2):
5         pl.figure(i)
6         pl.plot(np.arange(0,10*(i+1)))
7     pl.show()
當然以上假設您用的都是import pylab as pl
如果不是這種情況該方式就不適用了。
/Files/wangkang2009/pypublish.rar
posted @ 2014-03-07 19:32 wangkang 閱讀(238) | 評論 (0)編輯 收藏

python調用c dll api


關鍵字: python dll調用 np類型轉換 double


關于python調用dll的文章有很多, 本篇主要描述對double數組傳參的實現, 本人還沒有發現類似的文章, 因此書寫本文檔加以說明。

本文實現主要參考《用python進行科學計算》一書, 因此對環境有要求, 環境需要安裝python(x,y), 該軟件可以很好的支持numpy庫,
否則用sf上下載的numpy安裝包直接在python里安裝貌似裝了不生效, 也就是import numpy失敗

下面簡單講下實現過程

1. 制作dll, 假設dll中有如下的導出函數, dll名為smooth
// @param: n   數組長度
// @param: x   [input/output] 一維數組
// @param: y   [input/output]
// @param: weights   [input]  可為0
// @param: s   [input/output] 單值,返回新的x,y長度
int smooth(int n, double* x, double* y, double* weights, double* s);


2. 加載dll
import numpy as np
from ctypes import *

dll = np.ctypeslib.load_library('smooth', '.')


3. 執行函數
c里的double是64位的, 因此簡單的傳參會是32位的, 比如用下面的實現就會有這樣的問題
smooth = dll.smooth
#[Warning:下面是一個錯誤的演示]
#描述參數類型
smooth.argtypes = [c_int, POINTER(c_double), POINTER(c_double), POINTER(c_double), POINTER(c_double)]
#返回值類型
smooth.restype = c_int
x = [3.2, 3.9, 5.4, 5.9]
x = np.array(x)
y = np.array(x)
w = np.array(0)
s = np.array(10)
smooth(len(x), x.ctypes.data_as(POINTER(c_double)), y.ctypes.data_as(POINTER(c_double)), w.ctypes.data_as(POINTER(c_double)), s.ctypes.data_as(POINTER(c_double)) )

調用后python沒有報錯, 但不能得到正確的結果, 進入vc附加python進程, 在函數頭加上斷點, 查看參數內存, 可看出其是以int*方式傳入的
要讓python以真正的64位double*傳入可使用下面的實現
#正確的調用
smooth.argtypes = [
    c_int,
    np.ctypeslib.ndpointer(dtype=np.float64, ndim=1, flags="C_CONTIGUOUS"), #一維數組,且內存連續的
    np.ctypeslib.ndpointer(dtype=np.float64, ndim=1, flags="C_CONTIGUOUS"),
    np.ctypeslib.ndpointer(dtype=np.float64),
    np.ctypeslib.ndpointer(dtype=np.float64)
]
smooth.restype = c_int
m = [3.2, 3.9, 5.4, 5.9]
x = np.arange(4, dtype=np.float64)
y = np.arange(4, dtype=np.float64)
w = np.cast["float64"](0)
s = np.cast["float64"](10)
for i in range(0, len(m)):
 x[i] = m[i]
 y[i] = m[i]
smooth(len(x), x, y, w, s)

題外話: python的參數基本可以看為指針, 類似引用等操作都可以輕松完成

本人對numpy不是很熟, 可能對于np的參數初始化有更好的方式, 此處就算拋磚引玉吧,

 

 


 

posted @ 2013-08-27 11:34 wangkang 閱讀(2351) | 評論 (0)編輯 收藏
編輯框的背景色一般是白色的, 時間長了看起來比較費勁, 用vc自帶的也可以改背景色, 這里提供一個更快捷的方案.
注意,for vc2010

1. 用vc2010建一個擴展項目


2. 創建該項目,按照下面圖示走完向導。






3. 完成后項目建立, 依次修改
STDMETHODIMP CConnect::OnStartupComplete (SAFEARRAY ** /*自定義*/ )   // 項目加載后觸發

STDMETHODIMP CConnect::Exec(BSTR bstrCmdName, vsCommandExecOption ExecuteOption, VARIANT * /*pvarVariantIn*/, VARIANT * /*pvarVariantOut*/, VARIANT_BOOL *pvbHandled) // 選擇命令后觸發
 1 // 項目啟動后觸發
 2 STDMETHODIMP CConnect::OnStartupComplete (SAFEARRAY ** /*自定義*/ )
 3 {
 4     //RunBackGroundChange();
 5     CAddMyComment ac(m_pDTE);
 6     COLORREF clrBlack = 0x00c2c2c2;    // 銀色
 7     ac.SetColor(clrBlack);
 8     ac.SetColor(clrBlack);
 9 
10     return S_OK;
11 }
STDMETHODIMP CConnect::Exec(BSTR bstrCmdName, vsCommandExecOption ExecuteOption, VARIANT * /*pvarVariantIn*/, VARIANT * /*pvarVariantOut*/, VARIANT_BOOL *pvbHandled)
{
    *pvbHandled = VARIANT_FALSE;
    if(ExecuteOption == vsCommandExecOptionDoDefault)
    {
        if(!_wcsicmp(bstrCmdName, L"backgroundchange.Connect.backgroundchange"))
        {
            RunBackGroundChange();

            *pvbHandled = VARIANT_TRUE;
            return S_OK;
        }
    }
    return S_OK;
}

 1 
 2 // 改變編輯器背景顏色
 3 void CAddMyComment::ChangeFont(void)
 4 {
 5     CComPtr<EnvDTE::Properties> spProperties;
 6 
 7     // Modify font size
 8     m_spDTE->get_Properties(CComBSTR("FontsAndColors"), CComBSTR("TextEditor"), &spProperties);
 9     CComPtr<EnvDTE::Property> spProperty;
10     spProperties->Item(CComVariant(L"FontSize"), &spProperty);    // FontSize
11     ATLASSERT(spProperty);
12     spProperty->put_Value(CComVariant(11));
13 
14     CComPtr<EnvDTE::Property> spProperty1;
15     spProperties->Item(CComVariant(CComBSTR(L"FontsAndColorsItems")), &spProperty1);    // FontsAndColorsItems
16     ATLASSERT(spProperty1);
17     CComPtr<IDispatch> spDispatch;
18     spProperty1->get_Object(&spDispatch);
19     CComPtr<EnvDTE::FontsAndColorsItems> spFontsAndColorsItems;
20     spFontsAndColorsItems = spDispatch;
21     ATLASSERT(spFontsAndColorsItems);
22 #if 0
23     // 顯示顏色命名
24     long count ;
25     spFontsAndColorsItems->get_Count(&count);
26     for(long i=0; i<count; ++i) {
27         CComPtr<EnvDTE::ColorableItems> spColor;
28         spFontsAndColorsItems->Item(CComVariant(i), &spColor);
29         if(spColor) {
30             CComBSTR bstrName;
31             spColor->get_Name(&bstrName);
32             ATLTRACE(L"[%d]%s\n",i, bstrName);
33         }
34     }
35 #endif
36 
37 #if 1
38     // Modify Plain Text Background
39     CComPtr<EnvDTE::ColorableItems> spColorableItems_PlainText;
40     spFontsAndColorsItems->Item(CComVariant(1), &spColorableItems_PlainText);
41     CComPtr<EnvDTE::ColorableItems> spColorableItems_LineNumber;
42     spFontsAndColorsItems->Item(CComVariant(5), &spColorableItems_LineNumber);
43     //CComPtr<EnvDTE::ColorableItems> spColorableItems_Identifier;
44     //spFontsAndColorsItems->Item(CComVariant(L"Identifier"), &spColorableItems_Identifier);
45 
46     COLORREF clrWhite = #ffffff;
47     COLORREF clrBlack = #000000;
48     clrBlack = 0x00c2c2c2;    // 銀色
49     COLORREF clrWhite2 = 12632256;
50     clrWhite2 =  clrWhite;
51     OLE_COLOR color;
52     spColorableItems_PlainText->get_Background(&color);
53     if(color == clrBlack) {
54         spColorableItems_PlainText->put_Background(clrWhite);
55         spColorableItems_LineNumber->put_Background(clrWhite);
56         //spColorableItems_PlainText->put_Foreground(clrBlack);
57     }else {
58         spColorableItems_PlainText->put_Background(clrBlack);
59         spColorableItems_LineNumber->put_Background(clrBlack);
60         //spColorableItems_PlainText->put_Foreground(clrWhite2);
61     }
62 #endif
63 }
64 

4. 執行命令, 進入項目后, 在菜單工具下會創建一個菜單項


點選后, 會在白色背景和銀色間切換, 初始會進入銀色背景。


5. 可直接使用msi安裝包安裝該插件, 同時該附件包含源代碼
/Files/wangkang2009/backgroundchange.rar











posted @ 2013-04-17 14:55 wangkang 閱讀(1763) | 評論 (0)編輯 收藏
   今天又犯了一個低級錯誤, 情況是這樣的, 編譯好的代碼下斷點后總是與源代碼不匹配, 弄了半天才想起來主項目沒有編譯。

   對于這樣的問題應該注意需要編譯主項目, 最好的辦法是設上依賴項。
posted @ 2012-12-07 13:34 wangkang| 編輯 收藏

windows 下VC6制作php擴展dll

網上有很多該問題的文章, 之所以再寫一遍, 是因為我根據他們的文章沒有跑通, 綜合了多人的文章加上一些自己的理解
最終解決了這個問題。

1. 下載帶source的php(v5.2)包及同版本編譯好的包(php最好使用同版本的), 這是vc6編譯的, 在php.net可下載

2. 解壓source包后找到ext\skeleton, 復制出一份新的, 目錄改名為hello

3. 打開目錄里面的.dsp, .c, .h, 把里面extname全部替換為hello

4. 把php5ts.lib拷貝至開發目錄, 修改lib里的依賴php5ts_debug.lib 至php5ts.lib, 修改dll輸出到php的ext目錄

5. f7編譯, 不出意外應編譯通過。 注意, 一定要使用release編譯, 用debug加載時不認, 我就因為這個問題卡住了很久。

6. php.ini里加入extension=php_hello.dll, 沒設置擴展目錄的話加上extension_dir = "d:/Progra~1/Apache/PHP/ext/",
重啟apache

7. 不出意外, 在phpinfo()中可以看見hello??榱?。

8. 寫一個php, 內容如下
<?
echo confirm_hello_compiled("kdskf");
?>
頁面執行后可看見string輸出。


參考
//blog.csdn.net/cyberhero/article/details/5966920

//blog.csdn.net/php_boy/article/details/6456603

posted @ 2012-08-15 11:00 wangkang 閱讀(720) | 評論 (0)編輯 收藏

VC to Object-C

本博客所有文章均為原創, 謝絕轉載

1. Class
// 類聲明
@interface MyTest : NSObject
{
// @private 私有, @package 
 int num1;
 int num2;
}

// 屬性
@porperty int num1, num2;

// 類方法
-(void) print;
-(int) Test2;

// 多參數函數
// 方法稱為setTo:set2:, 其實就是void setTo_set2(int a, int b);
// Object-C和C++比更象一種描述語言
// 調用[mytest setTo : 1 set2 : 3];
-(void) setTo : (int) a set2: (int) b
{
 num1 = a;
 num2 = b;
}

// 類似于vc里的static void print2();
// 調用[MyTest print2];  同CMyTest::print2();
+(void) print2;
@end

// 類實現
@implementation MyTest

// 編譯器會自動生成類似get,put的方法
// 不用@porperty, 需要自己現實現屬性數據的讀寫
@synthesize num1, num2;

-(void) print
{
 // 輸出到調試區, 類似OutputString
 NSLog(@"%i/%i", num1, num2);
}

-(int) Test2
{
 return 10;
}
@end


// 調用
MyTest* p = [[MyTest alloc] init]; // init是NSObject的方法, 類似C++里的構造, 不過oc只能用指針
[p setTo : 1 set2 : 3];
[p print];
[p release];

// 輸出
1/3


2. 帶分類的類, 分類就是提供一個方法組合
//1. 分類不能建變量
//2. 最好不要重載主類的方法
//3. 可以不實現分類的全部方法
@interface MyTest (MyTestEx)  // 括號里的MyTestEx作為MyTest類的分類
-(int) add : (int) a;
-(int) sub : (int) a;
@end


@implementation MyTest (MyTestEx)
-(int) add : (int) a
{
 num1 += a;
}
-(int) sub : (int) a
{
 num1 -= a;
}
@end

// 調用
MyTest* p = [[MyTest alloc] init]; 
[p setTo : 1 set2 : 3];
[p add : 1];
[p print];
[p release];

// 輸出
2/3


3. 協議
協議是多個類共享一個方法列表。 就有點象C++里的虛函數表
協議只負責聲明, 實現由引用類負責

// 這是一個協議聲明, 感覺就是vc里的接口聲明
// interface NSCopying {
// void* copyWithZone(NSZone* zone) = 0;
// };
@protocol NSCopying
-(id)copyWithZone: (NSZone*)zone;
@optional // 該關鍵字后的方法可以不實現
-(void) outline;
@end

// 使用協議, 協議用尖括號包含起來, 放在類名或基類名稱之后
// VC里應該是這樣class CAddressBook : public CNSObject , public INSCopying {};
@interface AddressBook : NSObject <NSCopying>
@end
// 可以使用多個協議, 就象VC里的多重繼承
// class CAddressBook : public CNSObject , public INSCopying , public INSCoding{};
@interface AddressBook : NSObject <NSCopying, NSCoding>
@end


 

posted @ 2012-02-11 15:34 wangkang 閱讀(340) | 評論 (0)編輯 收藏
僅列出標題  下一頁