• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Error

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

            #

            int *p = new int[10]; delete [] p; 既然 delete 時無需提供數(shù)組大小,那么顯然編譯器是知道數(shù)組的大小(或者說界限的)。 那么 編譯器是如何知道數(shù)組大小的?(比如維護(hù)了一張表、按特定格式存儲……) 既然知道數(shù)組大小,編譯器能否自動檢查數(shù)組越界的情況?不檢查是否是為了性能? 編程時如何利用這份信息? 另外,不借助搜索引擎如何解答這個問題,有類似文檔之類的東西可以參考嗎?修改 1:拿msvc來說,在new/malloc返回的ptr前n個字節(jié)里保存了大小,msvc還可以用_msize()來獲得size,具體保存在哪可以調(diào)試看看; 2:編譯器未必知道,有些size是運行時決定的.真正記錄大小是在運行時,而不是編譯期.數(shù)組越界不能自動檢查,ptr + offset,這種方式程序無法知道程序員的本意要訪問的到底是不是數(shù)組那塊內(nèi)存 3:特定環(huán)境下可能有用啊.(例:一個妹子問我在vs里怎么通過一個new出來的指針獲得size,然后就可以利用這些信息換妹子崇拜的眼神) PS:上調(diào)試器. 作者:吉林小伙 鏈接:https://www.zhihu.com/question/27112272/answer/35301722 來源:知乎 著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 1:new的時候已經(jīng)多new了點空間把長度寫進(jìn)去了 2:不能檢查,因為不是所有的指針都是new出來,誰知道到底指向的是什么 3:根據(jù)C++標(biāo)準(zhǔn)的話,沒辦法利用 4:反正VC++已經(jīng)98%以上跟標(biāo)準(zhǔn)完全一致了,而且gcc跟clang的私貨也不比VC++少,你去msdn看C++語法手冊就好了 C++ Language Reference,手冊只要你讀兩遍,你就什么都明白了。我初三就是讀了兩遍VC++5.0時代的msdn的語法手冊學(xué)會C++的。當(dāng)然要熟悉還是要靠練習(xí),光讀的話就算都記住了,也只能一知半解。 作者:vczh 鏈接:https://www.zhihu.com/question/27112272/answer/35291952 來源:知乎 著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
            posted @ 2016-03-22 10:21 Enic 閱讀(398) | 評論 (0)編輯 收藏

            首先Ref不用解釋。
            cocos和常見的Ref或者智能指針稍微有點不一樣:
            首先介紹傳統(tǒng)玩法:
            傳統(tǒng)玩法Ref一般要配合RefPtr使用的,也就是new出來的Ref派生類引用計數(shù)為0,要放到一個RefPtr里邊來做生命周期管理。

            在來看看cocos的玩法:
            new出來Ref引用計數(shù)是為1的,那么問題來了,這樣如果Add和Release成對出現(xiàn)則Ref永遠(yuǎn)回不到0了。
            cocos是這樣解決這個問題的:autorelease
            調(diào)用autorelease,會把當(dāng)前Ref為1的對象壓入pool,然后在下一幀的調(diào)用release這樣就天下太平了,如果有add到其他節(jié)點上他就會變1,如果沒有就直接歸零析構(gòu)了
            這樣就省掉了RefPtr操作


            為了保持風(fēng)格統(tǒng)一,我也必須這樣玩,這樣的優(yōu)勢是不需要RefPtr,可能腳本綁定會方便不少吧
            posted @ 2016-03-15 20:52 Enic 閱讀(292) | 評論 (0)編輯 收藏

            WebSocket is an underlying network protocol that enables you to build other standard
            protocols on top of it.

            The WebSocket Protocol enables full duplex communication between a client and
            a remote server over the Web, and supports transmission of binary data and text strings.
            The protocol consists of an opening handshake followed by basic message framing, and is
            layered over TCP.


            WebSocket programming follows an asynchronous programming model, which
            means that as long as a WebSocket connection is open, your application simply listens
            for events. Your client does not need to actively poll the server for more information. To
            start listening for the events, you simply add callback functions to the WebSocket object.
            Alternatively, you can use the addEventListener() DOM method to add event listeners
            to your WebSocket objects.
            A WebSocket object dispatches four different events:
            · Open
            · Message
            · Error
            · Close
            As with all web APIs, you can listen for these events using on<eventname> handler
            properties, as well as using the addEventListener(); method.

            ws.onopen
            ws.onmessage
            ws.onerror
            ws.onclose

            e.data instanceof Blob
            ws.binaryType = "blob"

            WebSocket objects have two methods: send() and close()


            Listing 2-12. Waiting for the Open Event Before Sending a Message
            // Wait until the open event before calling send().
            var ws = new WebSocket("ws://echo.websocket.org")
            ws.onopen = function(e) {
            ws.send("Initial data");
            }

            Listing 2-13. Checking the readyState Property for an Open WebSocket
            // Handle outgoing data. Send on a WebSocket if that socket is open.
            function myEventHandler(data) {
            if (ws.readyState === WebSocket.OPEN) {
            // The socket is open, so it is ok to send the data.
            ws.send(data);
            } else {
            // Do something else in this case.
            //Possibly ignore the data or enqueue it.
            }
            }


            // Send a Blob
            var blob = new Blob("blob contents");
            ws.send(blob);
            // Send an ArrayBuffer
            var a = new Uint8Array([8,6,7,5,3,0,9]);
            ws.send(a.buffer);


            Listing 2-15. Calling the close() Method
            // Close the WebSocket connection
            ws.close();
            You can optionally pass two arguments to the close() method: code (a numerical
            status code) and reason (a text string). Passing these arguments transmits information
            to the server about why the client closed the connection. We will discuss the status
            codes and reasons in greater detail in Chapter 3, when we cover the WebSocket closing
            handshake. Listing 2-16 shows an example of calling the close() method with an
            argument.
            Listing 2-16. Calling the close() Method with a Reason
            // Close the WebSocket connection because the session has ended successfully
            ws.close(1000, "Closing normally");
            Listing 2-16 uses code 1000, which means, as it states in the code, that the
            connection is closing normally.


            WebSocket Object Attributes
            There are several WebSocket Object attributes you can use to provide more information
            about the WebSocket object: readyState, bufferedAmount, and protocol.

            Table 2-1. readyState Attributes, Values, and Status Descriptions
            Attribute Constant     Value     Status
            WebSocket.CONNECTING   0   The connection is in progress but has not been established.
            WebSocket.OPEN   1   The connection has been established. Messages can flow between the client and server.
            WebSocket.CLOSING   2   The connection is going through the closing handshake.
            WebSocket.CLOSED   3   The connection has been closed or could not be opened.

            WebSocket Object Attribute: protocol
            The protocol attribute is the empty string before the
            opening handshake completes and remains an empty string if the server does not choose
            one of the protocols offered by the client.

             

            posted @ 2016-02-22 17:02 Enic 閱讀(267) | 評論 (0)編輯 收藏

            GDI+使用雙緩沖繪圖
            ————————————————————————
            我再來詳細(xì)解釋一下剛才實現(xiàn)雙緩沖的具體步驟:
            1、在內(nèi)存中建立一塊“虛擬畫布”:
            Bitmap bmp = new Bitmap(600, 600);
            2、獲取這塊內(nèi)存畫布的Graphics引用:
            Graphics g = Graphics.FromImage(bmp);
            3、在這塊內(nèi)存畫布上繪圖:
            g.FillEllipse(brush, i * 10, j * 10, 10, 10);
            4、將內(nèi)存畫布畫到窗口中
            this.CreateGraphics().DrawImage(bmp, 0, 0);
            ====================
            maybe better
            CDC dcMemory;
            dcMemory.CreateCompatibleDC(&dc);
            CBitmap bmp;
            bmp.CreateCompatibleBitmap(&dc,1024,768);
            dcMemory.SelectObject(&bmp);
               
            Graphics _Graphics(dcMemory.m_hDC);
            _Graphics.DrawImage(_pImage,0,0,1024,768);
            //這是在GDI+中的寫法。
               
            dc.BitBlt(0,0,1024,768,&dcMemory,0,0,SRCCOPY);
               
            _Graphics.ReleaseHDC(dcMemory.m_hDC);
            dcMemory.DeleteDC();
            bmp.DeleteObject(); 



            -------------------------------------------------------------------------
            補充:
            1.對于GDI常見的做法都是MemDC一下不解釋了
            2.GDI+似乎也可以用MemDC生成一個graphics,然后畫好了,在把MemDC bit到WndDC上,但是會有各種各樣的問題。
            3.不管是那種方式,都是一個宗旨:直接操作前臺屏幕上的DC在繪圖的過程中會顯得比較慢,所以生成一個內(nèi)存畫布,把所有的貼圖操作都在不可見的內(nèi)存畫布上操作完成,然后一次性貼圖到前臺DC上。這樣實際上還多了一次貼圖,但是對于前臺DC的操作已經(jīng)是無限小了。
            4.GDI+還有一種更優(yōu)的方式:創(chuàng)建一個內(nèi)存bitmap,然后從內(nèi)存bitmap創(chuàng)建出GDI+位圖,然后使用做個位圖作為渲染畫布。渲染完成后,在直接把bitmap貼圖到前臺DC上面來,內(nèi)存中的bitmap是復(fù)用的,不用在每個渲染事件中重新創(chuàng)建。
            5.為了更好的GL或者其他的渲染接口融合,基于bitmap的內(nèi)存畫布應(yīng)該是最優(yōu)的做法。




            posted @ 2015-11-12 14:28 Enic 閱讀(408) | 評論 (0)編輯 收藏

            數(shù)據(jù)庫備份實例/** 
            **數(shù)據(jù)庫備份實例 
            **朱二 2004年5月 
            **備份策略: 
            **數(shù)據(jù)庫名:test 
            **備份文件的路徑e:\backup 
            **每個星期天凌晨1點做一次完全備份,為保險起見,備份到兩個同樣的完全備份文件test_full_A.bak和test_full_B.bak 
            **每天1點(除了星期天)做一次差異備份,分別備份到兩個文件test_df_A.bak和test_df_B.bak(采用附加到原備份的方式) 
            **每一個小時做一次事務(wù)日志備份,分別備份到兩個文件test_log_A.bak和test_log_B.bak(采用附加到原備份的方式) 
            **/ 


            --第一 完全備份部分 
            --新增作業(yè) 
            EXEC sp_add_job @job_name = '完全備份' 
            --新增作業(yè)步驟1,把數(shù)據(jù)庫備份到test_full_backup_A.bak 
            EXEC sp_add_jobstep @job_name = '完全備份', 
            @step_name = 'Setp1', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_full_A.bak'' WITH INIT', 
            @on_fail_action=3, --失敗后轉(zhuǎn)到下一步 
            @on_success_action=3,-- 成功后轉(zhuǎn)到下一步 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --新增作業(yè)步驟2,把數(shù)據(jù)庫備份到test_full_B.bak 
            EXEC sp_add_jobstep @job_name = '完全備份', 
            @step_name = 'Setp2', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_full_B.bak'' WITH INIT', 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --調(diào)度 
            EXEC sp_add_jobschedule @job_name = '完全備份', 
            @name = 'Schedule_1', 
            @freq_type = 8, -- 按周 
            @freq_interval = 1, --每星期天執(zhí)行 
            @freq_recurrence_factor=1, 
            @active_start_time = 10000 --開始時間: 凌晨1點 
            --第二 差異備份部分 
            --新增作業(yè) 
            EXEC sp_add_job @job_name = '差異備份' 
            --新增作業(yè)步驟1,把數(shù)據(jù)庫備份到test_df_A.bak 
            EXEC sp_add_jobstep @job_name = '差異備份', 
            @step_name = 'Setp1', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_df_A.bak'' WITH DIFFERENTIAL', 
            @on_fail_action=3, --失敗后轉(zhuǎn)到下一步 
            @on_success_action=3,-- 成功后轉(zhuǎn)到下一步 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --新增作業(yè)步驟2,把數(shù)據(jù)庫備份到test_df_B.bak 
            EXEC sp_add_jobstep @job_name = '差異備份', 
            @step_name = 'Setp2', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_df_B.bak'' WITH DIFFERENTIAL', 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --調(diào)度 
            EXEC sp_add_jobschedule @job_name = '差異備份', 
            @name = 'Schedule_1', 
            @freq_type = 8, -- 按周 
            @freq_interval = 126, --星期一至星期六 
            @freq_recurrence_factor=1, 
            @active_start_time = 10000 --開始時間: 凌晨1點 


            --第二 事務(wù)備份部分 
            --新增作業(yè) 
            EXEC sp_add_job @job_name = '事務(wù)備份' 
            --新增作業(yè)步驟1,把數(shù)據(jù)庫備份到test_log_A.bak 
            EXEC sp_add_jobstep @job_name = '事務(wù)備份', 
            @step_name = 'Setp1', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP LOG Test TO DISK=''e:\backup\test_log_A.bak''', 
            @on_fail_action=3, --失敗后轉(zhuǎn)到下一步 
            @on_success_action=3,-- 成功后轉(zhuǎn)到下一步 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --新增作業(yè)步驟2,把數(shù)據(jù)庫備份到test_log_B.bak 
            EXEC sp_add_jobstep @job_name = '事務(wù)備份', 
            @step_name = 'Setp2', 
            @subsystem = 'TSQL', 
            @command = 'BACKUP LOG Test TO DISK=''e:\backup\test_log_B.bak''', 
            @retry_attempts = 5, 
            @retry_interval = 5 

            --調(diào)度 
            EXEC sp_add_jobschedule @job_name = '事務(wù)備份', 
            @name = 'Schedule_1', 
            @freq_type = 4, -- 按天 
            @freq_interval=1,--每一天 
            @freq_subday_type=8, --按小時 
            @freq_subday_interval=1 --每一個小時 
            posted @ 2015-09-06 09:33 Enic 閱讀(181) | 評論 (0)編輯 收藏

            bpack=string.pack
            bunpack=string.unpack
            -- 輸出二進(jìn)制
            function hex(s)
             s=string.gsub(s,"(.)",function (x) return string.format("%02X",string.byte(x)) end)
             return s
            end
            --解包傳入的是hex和FMT(><大小端),輸出是FMT指定的類型:i int, n lua_num
            --i=12345 f="i"
            --a=bpack(f,i,i,i)
            --print(hex(a))
            --print(bunpack(a,f))
            --打包輸入fmt,實際類型,輸出hex
            local n = 0x12345678
            --tb = {}
            --dump(tb)
            --tb = n
            --dump(tb)
            a = bpack('>n', n)
            dump(hex(a))
            posted @ 2015-09-01 18:30 Enic 閱讀(312) | 評論 (0)編輯 收藏

            --如何定義枚舉
            --下面的函數(shù)實現(xiàn):
            --轉(zhuǎn)換 EnumTable = {1:Enum1, 2:Enum2}
            --到   EnumTable = {Enum1:1, Enum2:2}
            function CreateEnumTable(tb, indexStart)
                --assert(IsTable(tb))
                local enumTB = {}
                local enumIndex = indexStart or 0
                
                --轉(zhuǎn)換字符table到枚舉table
                for index, value ipairs(tb) do
                    enumTB[v] = enumIndex + index
                end
                return enumTB
            end
            --只是返回值而已和C不一樣
            assert(0)
            --用這個和字符串比較實現(xiàn)判斷變量類型
            print(type(CreateEnumTable))
            --xpcall可以保護(hù)執(zhí)行一個函數(shù),通過返回值確定異常情況
            posted @ 2015-09-01 17:29 Enic 閱讀(884) | 評論 (0)編輯 收藏

            VC++ Runtime Error 異常捕獲之不掛的程序

             很多軟件通過設(shè)置自己的異常捕獲函數(shù),捕獲未處理的異常,生成報告或者日志(例如生成mini-dump文件),達(dá)到Release版本下追蹤Bug的目的。但是,到了VS2005(即VC8),Microsoft對CRT(C運行時庫)的一些與安全相關(guān)的代碼做了些改動,典型的,例如增加了對緩沖溢出的檢查。新CRT版本在出現(xiàn)錯誤時強制把異常拋給默認(rèn)的調(diào)試器(如果沒有配置的話,默認(rèn)是Dr.Watson),而不再通知應(yīng)用程序設(shè)置的異常捕獲函數(shù),這種行為主要在以下三種情況出現(xiàn)。

            (1)       調(diào)用abort函數(shù),并且設(shè)置了_CALL_REPORTFAULT選項(這個選項在Release版本是默認(rèn)設(shè)置的)。

            (2)       啟用了運行時安全檢查選項,并且在軟件運行時檢查出安全性錯誤,例如出現(xiàn)緩存溢出。(安全檢查選項/GS 默認(rèn)也是打開的)

            (3)       遇到_invalid_parameter錯誤,而應(yīng)用程序又沒有主動調(diào)用

            _set_invalid_parameter_handler設(shè)置錯誤捕獲函數(shù)。

            所以結(jié)論是,使用VS2005(VC8)編譯的程序,許多錯誤都不能在SetUnhandledExceptionFilter捕獲到。這是CRT相對于前面版本的一個比較大的改變,但是很遺憾,Microsoft卻沒有在相應(yīng)的文檔明確指出。

            解決方法

                   之所以應(yīng)用程序捕獲不到那些異常,原因是因為新版本的CRT實現(xiàn)在異常處理中強制刪除所有應(yīng)用程序先前設(shè)置的捕獲函數(shù),如下所示:

             /* Make sure any filter already in place is deleted. */

             SetUnhandledExceptionFilter(NULL);

             UnhandledExceptionFilter(&ExceptionPointers);

            解決方法是攔截CRT調(diào)用SetUnhandledExceptionFilter函數(shù),使之無效。在X86平臺下,可以使用以下代碼。

            #ifndef _M_IX86

                   #error "The following code only works for x86!"

            #endif

             

            void DisableSetUnhandledExceptionFilter()

            {

                void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),

                                                                     "SetUnhandledExceptionFilter");

                if (addr)

                {

                          unsigned char code[16];

                          int size = 0;

                          code[size++] = 0x33;

                          code[size++] = 0xC0;

                          code[size++] = 0xC2;

                          code[size++] = 0x04;

                          code[size++] = 0x00;

             

                           DWORD dwOldFlag, dwTempFlag;

                          VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);

                          WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);

                          VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);

                   }

            }

            在設(shè)置自己的異常處理函數(shù)后,調(diào)用DisableSetUnhandledExceptionFilter禁止CRT設(shè)置即可。

            其它討論

                   上面通過設(shè)置api hook,解決了在VS2005上的異常捕獲問題,這種雖然不是那么“干凈”的解決方案,確是目前唯一簡單有效的方式。

                   雖然也可以通過_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT), signal(SIGABRT, ...), 和_set_invalid_parameter_handler(...) 解決(1)(3),但是對于(2),設(shè)置api hook是唯一的方式。

            注:對于錯誤是否顯示錯誤提示框,可以使用SetErrorMode()


            后面又遇到WIN8.1上
            VirtualProtect報錯C0000005,最后還是想辦法解決了

            bool AdjustPrivileges() 
            {     
                HANDLE hToken;     
                TOKEN_PRIVILEGES tp;     
                TOKEN_PRIVILEGES oldtp;     
                DWORD dwSize=sizeof(TOKEN_PRIVILEGES);     
                LUID luid;       
                if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
                {         
                    if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;         
                    else return false;     
                }     

                if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) 
                {        
                    CloseHandle(hToken);         
                    return false;     
                }     
                
                ZeroMemory(&tp, sizeof(tp));     
                tp.PrivilegeCount=1;     
                tp.Privileges[0].Luid=luid;     
                tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;     
                /* Adjust Token Privileges */    
                if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) 
                {        
                    CloseHandle(hToken);         
                    return false;     
                }     
                
                // close handles     
                CloseHandle(hToken);     
                return true



            void DisableSetUnhandledExceptionFilter()

            {

                void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),

                    "SetUnhandledExceptionFilter");

                if (addr)

                {

                    unsigned char code[16];

                    int size = 0;

                    code[size++] = 0x33;

                    code[size++] = 0xC0;

                    code[size++] = 0xC2;

                    code[size++] = 0x04;

                    code[size++] = 0x00;

                    //SetProcessDEPPolicy(1);

                    DWORD dwOldFlag, dwTempFlag;

                    // win8.1下用百度找了下PAGE_READWRITE崩潰,實際測試提升debug權(quán)限,SetProcessDEPPolicy(1);都無效,改成PAGE_EXECUTE_READWRITE生效
                    
            //VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
                    VirtualProtect(addr, size, PAGE_EXECUTE_READWRITE, &dwOldFlag);
                    WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);

                    VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);

                }

            }



            posted @ 2015-08-28 11:14 Enic 閱讀(705) | 評論 (0)編輯 收藏

            在下面的章節(jié)中, 你將會學(xué)到如何用 Apache, Tomcat 和微軟的 IIS 創(chuàng)建 MIME 類型.

            " src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">用 Apache 創(chuàng)建 MIME 類型

            在 Apache 里, MIME 類型和文件擴展名之間的映射是被存放在配置文件 "apache根目錄/conf/mime.types" 里的 (對于大多數(shù) LINUX 系統(tǒng), 是放在 /etc/apache2/mods-available 里的), 這里的 "apache根目錄" 是 Apache 在你的服務(wù)器上的安裝路徑.

            要創(chuàng)建 MIME 類型, 打開 mime.types 文件. 以 # 字符開頭的行是注釋行, Apache 會忽略它們. 其它每行都以某種 MIME 類型開頭, 然后跟著一種或多種文件擴展名. 其形式如下:

            mime類型 文件擴展名1 文件擴展名2 文件擴展名3 ... 

            下面是一些例子:

            text/html html htm application/vnd.wap.xhtml+xml xhtml text/vnd.wap.wml wml text/vnd.wap.wmlscript wmls image/vnd.wap.wbmp wbmp 

            " src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">用 Tomcat 創(chuàng)建 MIME 類型

            在 Tomcat 5.x 和 4.x 里, MIME 類型和文件擴展名之間的缺省映射是被存放在文件 tomcat根目錄/conf/web.xml 里的, 這里的 "tomcat根目錄" 是 Tomcat 在你的服務(wù)器上的安裝目錄. 該文件里所指定的映射會被應(yīng)用到你的 Tomcat 服務(wù)器所運行的所有 Web/WAP 應(yīng)用程序上. 針對應(yīng)用程序的映射應(yīng)該 Web/WAP 應(yīng)用的目錄里的 WEB-INF/web.xml 文件里設(shè)置.

            每種映射都要用 <mime-mapping>, <extension> 和 <mime-type> 標(biāo)簽來指定. 下面就是一個例子:

            <web-app> ...    <mime-mapping>     <extension>xhtml</extension>     <mime-type>application/vnd.wap.xhtml+xml</mime-type>   </mime-mapping>    <mime-mapping>     <extension>wml</extension>     <mime-type>text/vnd.wap.wml</mime-type>   </mime-mapping>    <mime-mapping>     <extension>wmls</extension>     <mime-type>text/vnd.wap.wmlscript</mime-type>   </mime-mapping>    <mime-mapping>     <extension>wbmp</extension>     <mime-type>image/vnd.wap.wbmp</mime-type>   </mime-mapping>  ... </web-app> 

            " src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">用微軟的 IIS 創(chuàng)建 MIME 類型

            微軟的 IIS 提供了一個創(chuàng)建 MIME 類型的圖形界面. 下面列出了在 Windows Server 2003 上用 IIS 6.0 創(chuàng)建 MIME 類型步驟:

               1. 打開 IIS 窗口: 選擇 控制面板 -> 管理工具 -> Internet 服務(wù)管理器.
               2. 在左手邊的樹狀結(jié)構(gòu)中, 你應(yīng)當(dāng)可以看到其中有一項標(biāo)題為你的計算機的名字. 在其上點右鍵, 會彈出一個菜單.
               3. 點擊菜單中的屬性, 打開屬性窗口.
               4. 點擊 "HTTP 頭" 選項卡, 下面有 "MIME 映射", 點擊 "文件類型" 按紐.
               5. 在 "文件類型" 窗口中, 你可以看到一個 MIME 映射的列表. 用標(biāo)有 "新類型...", "刪除" 和 "編輯..."  的按紐作你想要的修改.

            在其它版本的 IIS 中創(chuàng)建 MIME 類型應(yīng)該與此類似.

            posted @ 2015-08-21 16:25 Enic 閱讀(135) | 評論 (0)編輯 收藏

            使用CMake GCC和Clang的/ LLVM之間切換

            cmake llvm clang
            我公司擁有一批項目的CMake的,我希望能夠方便地切換GCC或鐺/ LLVM他們。我相信(請如果我錯了!)表示鏘我需要進(jìn)行如下設(shè)置:
             SET (CMAKE_C_COMPILER    "/usr/bin/clang")  SET (CMAKE_C_FLAGS    "-Wall -std=c99")  SET (CMAKE_C_FLAGS_DEBUG   "-g")  SET (CMAKE_C_FLAGS_MINSIZEREL  "-Os -DNDEBUG")  SET (CMAKE_C_FLAGS_RELEASE  "-O4 -DNDEBUG")  SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")  SET (CMAKE_CXX_COMPILER    "/usr/bin/clang++")  SET (CMAKE_CXX_FLAGS    "-Wall")  SET (CMAKE_CXX_FLAGS_DEBUG   "-g")  SET (CMAKE_CXX_FLAGS_MINSIZEREL  "-Os -DNDEBUG")  SET (CMAKE_CXX_FLAGS_RELEASE  "-O4 -DNDEBUG")  SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")  SET (CMAKE_AR  "/usr/bin/llvm-ar")  SET (CMAKE_LINKER "/usr/bin/llvm-ld")  SET (CMAKE_NM  "/usr/bin/llvm-nm")  SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")  SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib") 
            是否有這些和默認(rèn)的GCC變量之間的切換,最好是全系統(tǒng)的變化,而不是具體的項目(即不只是將它們添加到項目的的CMakeLists.txt)一個簡單的方法? 另外,是否有必要的llvm-*節(jié)目鐺的gcc時代替,而不是系統(tǒng)默認(rèn)值?有什么區(qū)別?
            本文地址 :CodeGo.net/340772/ 
            ------------------------------------------------------------------------------------------------------------------------- 
            1. CMake的榮譽的變量CCCXX在檢測到C和C ++編譯器
            $ export CC=/usr/bin/clang $ export CXX=/usr/bin/clang++ $ cmake .. -- The C compiler identification is Clang -- The CXX compiler identification is Clang 
            具體標(biāo)志可以通過將它們放入一個系統(tǒng)范圍的CMake文件并指向CMAKE_USER_MAKE_RULES_OVERRIDE變量,它被覆蓋。創(chuàng)建一個文件~/ClangOverrides.txt其內(nèi)容如下:
            SET (CMAKE_C_FLAGS_INIT    "-Wall -std=c99") SET (CMAKE_C_FLAGS_DEBUG_INIT   "-g") SET (CMAKE_C_FLAGS_MINSIZEREL_INIT  "-Os -DNDEBUG") SET (CMAKE_C_FLAGS_RELEASE_INIT  "-O4 -DNDEBUG") SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") SET (CMAKE_CXX_FLAGS_INIT    "-Wall") SET (CMAKE_CXX_FLAGS_DEBUG_INIT   "-g") SET (CMAKE_CXX_FLAGS_MINSIZEREL_INIT  "-Os -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELEASE_INIT  "-O4 -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") 
            后綴_init會讓CMake的初始化相應(yīng)的*_FLAGS變量與給定的值。然后調(diào)用cmake的以下面的方式:
            $ cmake -DCMAKE_USER_MAKE_RULES_OVERRIDE=~/ClangOverrides.txt .. 
            終于到了LLVM的binutils力,設(shè)置內(nèi)部變量_CMAKE_TOOLCHAIN_PREFIX。這個變量是由榮幸CMakeFindBinUtils模塊:
            $ cmake -D_CMAKE_TOOLCHAIN_PREFIX=llvm- .. 
            把這個放在一起你可以寫一個shell包裝它設(shè)置了變量CCCXX然后調(diào)用cmake的可變覆蓋。 
            2. 全系統(tǒng)的C ++的變化對Ubuntu的: sudo用update-alternatives-配置C ++ 將打印是這樣的:
             Selection Path    Priority Status ------------------------------------------------------------ * 0   /usr/bin/g++  20  auto mode  1   /usr/bin/clang++ 10  manual mode  2   /usr/bin/g++  20  manual mode 
            然后,只需選擇鐺++。 
            3. 你的
            option(USE_CLANG "build application with clang" OFF) # OFF is the default 
            然后在包裹如果()S中的設(shè)置:
            if(USE_CLANG)  SET (...)  .... endif(USE_CLANG) 
            這樣,它會顯示為在GUI配置工具的cmake的選項。 為了讓您在整個系統(tǒng)可以在變量的默認(rèn)值或保持與答案。 
            4. 你絕對不需要不同的LLVM-AR等程序:
            SET (CMAKE_AR  "/usr/bin/llvm-ar") SET (CMAKE_LINKER "/usr/bin/llvm-ld") SET (CMAKE_NM  "/usr/bin/llvm-nm") SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump") SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib") 
            這些都是為了工作,對LLVM內(nèi)部格式,因此阿仁'到您的應(yīng)用程序的生成。 作為一個說明 CodeGo.net,O4將在你的程序調(diào)用的LTO,你可能不希望(這樣會大大)和鐺默認(rèn)為C99模式,使標(biāo)志不是必需的兩種。 
            5. 你的語法:$ENV{environment-variable}在你的CMakeLists.txt訪問變量。你可以適當(dāng)?shù)貏?chuàng)建一個初始化的變量集的腳本,只是在引用這些變量的CMakeLists.txt文件。
            posted @ 2015-08-20 11:52 Enic 閱讀(1419) | 評論 (0)編輯 收藏

            僅列出標(biāo)題
            共22頁: 1 2 3 4 5 6 7 8 9 Last 
            国内精品久久久久| 久久久无码精品亚洲日韩软件| 日韩久久久久久中文人妻| 日韩乱码人妻无码中文字幕久久 | 97r久久精品国产99国产精| 7777久久亚洲中文字幕| 久久无码国产| 久久精品国产免费一区| 无码人妻久久一区二区三区蜜桃| 91精品国产乱码久久久久久| 亚洲?V乱码久久精品蜜桃| 久久亚洲国产午夜精品理论片| 久久国产精品无| 精品久久久久久久久久中文字幕| 久久精品国产免费观看 | 亚洲va久久久噜噜噜久久男同| 国产精品久久久久久久午夜片 | 无码任你躁久久久久久| 欧美久久综合性欧美| 久久精品人人做人人爽电影| 激情综合色综合久久综合| 国产成人精品久久一区二区三区| 国产精品久久久久久久久久影院| 国产69精品久久久久777| 久久精品国产免费观看| 伊人色综合九久久天天蜜桃| 激情久久久久久久久久| 婷婷久久综合九色综合98| 欧洲成人午夜精品无码区久久| 狠狠综合久久综合88亚洲| 国产精品99久久久久久宅男小说| 久久亚洲2019中文字幕| 久久国产成人| 性做久久久久久免费观看| 久久夜色撩人精品国产| 久久久久女教师免费一区| 久久免费观看视频| 久久影院亚洲一区| 国产精品乱码久久久久久软件| 国产99久久久国产精品小说| 波多野结衣久久精品|