• <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++博客 首頁 新隨筆 聯系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

            #

            主要翻譯自lua文檔,加上了programming lua中自己的一些理解

            require(modname)

            加載給定的模塊.函數首先檢查表package.loaded來判定modname是否已經存在.如果存在,則require返回package.loaded[modname]所存儲的值否則它嘗試為模塊找到一個加載器(loader).

            要找到一個加載器,require首先查詢package.preloaded[modname].如果它有值,該值(應該是一個函數)就是加載器.如果沒值require使用package.path中存儲的路徑查找一個Lua的加載器.如果該查找也失敗,它使用package.cpath中存儲的路徑查找一個C語言加載器(C loader).如果還是失敗,它嘗試使用all-in-one加載器(如下)

            當加載一個C庫的時候,require首先使用動態鏈接工具將應用程序與庫連接起來.之后它嘗試找到一個該庫中的C函數,該函數要被當做加載器使用.這個C函數的名稱是字符串"luaopen_"連接著復制的模塊名(模塊名稱中的每個點號"."都被替換為一個下劃線).此外,如果模塊名稱含有連字符"-",則第一個連字符的前綴(包括連字符)都被移除.比如,如果模塊名稱是a.v1-b.c,則函數名稱將是luaopen_b_c.

            如果require即沒有為模塊找到一個Lua庫也沒有為模塊找到一個C庫,他將調用all-in-one加載器.該加載器為給定模塊的根名稱查找C路徑找到對應庫(原文:this loader searches the C path for a library for the root name of the given module).例如,當require a.b.c時,它將為a查找一個庫.如果找到,它查詢該庫內部為子模塊找到一個開放函數(open function);在我們這個例子中將會是luaopen_a_b_c.使用這個便利機制(facility),一個包可以將幾個子模塊打包進單個的庫中,同時每個子模塊保存著它本來的開放函數.

            一旦找到一個加載器,require使用單個的參數modname調用加載器.如果加載器返回任何值,require將其賦值給package.loaded[modname].如果加載器沒有返回值且沒有給package.loaded[modname]賦與任何值,則require為該條目賦值為true.無論如何,require返回package.loaded[modname]的最終值.

            如果加載或者運行模塊有任何錯誤,或者他不能為模塊找到一個加載器,則require發出一個錯誤信號.

            require函數的實現原理如下:

             

            1. --require 函數的實現  
            2. function require(name)  
            3.     if not package.loaded[name] then  
            4.         local loader = findloader(name) //這一步演示在代碼中以抽象函數findloader來表示  
            5.         if loader == nil then  
            6.             error("unable to load module" .. name)  
            7.         end  
            8.         package.loaded[name] = true  
            9.         local res = loader(name)  
            10.         if res ~= nil then  
            11.             package.loaded[name] = res  
            12.         end  
            13.     end  
            14.     return package.loaded[name]  
            15. end  

             

            package.cpath

            由require使用查找C加載器的路徑

            Lua初始化C路徑package.cpath的方法與初始化Lua路徑package.path的相同,使用LUA_CPATH中的環境變量(另外一個默認的路徑在luaconf.h中定義)

            package.loaded

            一個用于控制哪些模塊已經加載的表,該表由require使用.當require一個模塊名為modname的模塊且package.loaded[modname]不為false時,require僅返回package.loaded[modname]存儲的值.

            package.loadlib(libname,funcname)

            使用C庫libname動態鏈接到宿主程序.在這個庫中,尋找函數funcname并將該函數作為一個C函數返回.(所以,funcname必須遵守協議(參見lua_CFunction)).

            這是一個底層函數.它完全繞過了package和module系統.與require不同,它不執行任何路徑查找且不自動添加擴展名.libname必須是C庫中完整的文件名,如果必要的話還要包含路徑和擴展名.funcname必須是原封不動的C庫中導出的名字(這可能取決于使用的C編譯器和鏈接器).

            這個函數不被ANSI C支持.就其本身而言,它只在一些平臺上才能使用(Windows,Linux,Mac OS X,Solaris,BSD,加上其他支持dlfcn標準的Unix系統)

            package.path

            require用于查找Lua加載器的路徑

            在啟動時,Lua使用環境變量LUA_PATH或者如果環境變量未定義就使用luaconf.h中定義的默認值來初始化該值.環境變量中的任何"::"都被替換為默認路徑.

            路徑是一系列由分號隔開的模板(templates).對于每個模板,require將每個模板中的問號替換為filename,filename是modname中每個點都被替換成"目錄分隔符"(比如Unix中的"/")(這句感覺翻譯不準確,原文:For each template,require will change each interrogation mark in the template by filename,which is modname with each dot replaced by a "directory separator"(such as "/" in Unix));之后他將加載產生的文件名.因此,舉個例子,如果Lua路徑是"./?.lua;./?.lc;/usr/local/?/init.lua",為模塊foo查找一個Lua加載器將會嘗試以如下順序加載文件./foo.lua,./foo.lc和/usr/local/foo/init.lua

            package.preload

            為特定模塊存儲加載器的一個表(參見require)

            package.seeall(module)

            為module設置一個元表,module的__index只想全局環境(global environment),以便該module繼承全局環境中的值.作為函數module中的一個選項來使用.

            在Programming Lua中是這么講的:

            默認情況下,module不提供外部訪問.必須在調用它之前,為需要訪問的外部函數或模塊聲明適當的局部變量.也可以通過繼承來實現外部訪問,只需在調用module時附加一個選項package.seeall.這個選項等價于如下代碼:

             

            1. setmetatable(M,{__index = _G})  
            因而只需這么做:

             

             

            1. module(...,package.seeall)  

            module(name,[,...])

             

            創建一個模塊.如果在package.loaded[name]中有表,該表便是創建的模塊.否則,如果有一個全局表t其名稱與給定名稱相同,則該全局表便是創建的模塊.否則創建一個新的表t

            posted @ 2015-04-06 16:31 Enic 閱讀(306) | 評論 (0)編輯 收藏

            LogServer
            日志服務器看起來是一個完全獨立的服務器,啟動以后直接向某個邏輯服務器發起一個連接,然后根據如下的映射表工作起來:
            QLOG_MSG_ENTRY( GMSG_LOG_SERVER_INFO,gmsg_log_server_info)
            QLOG_MSG_ENTRY( GMSG_LOG_ITEM,gmsg_log_item)
            QLOG_MSG_ENTRY( GMSG_LOG_CHAT,gmsg_log_chat)
            QLOG_MSG_ENTRY( GMSG_LOG_ACCOUNT,gmsg_log_account)
            QLOG_MSG_ENTRY( GMSG_LOG_SYS,gmsg_log_sys)
            QLOG_MSG_ENTRY(GMSG_LOG_PLAYER,gmsg_log_player)
            QLOG_MSG_ENTRY(GMSG_LOG_SAMPLE,gmsg_log_sample)
            QLOG_MSG_ENTRY( GMSG_LOG_STAT,gmsg_log_stat)
            QLOG_MSG_ENTRY( GMSG_LOG_GM,gmsg_log_gm)
            QLOG_MSG_ENTRY(GMSG_LOG_QUEST,gmsg_log_quest)
            QLOG_MSG_ENTRY(GMSG_LOG_MAIL,gmsg_log_mail)
            QLOG_MSG_ENTRY(GMSG_LOG_SCRIPT,gmsg_log_script)
            QLOG_MSG_ENTRY(GMSG_LOG_TENCENT_CLIENT_WG, gmsg_log_tencent_client_wg)
            QLOG_MSG_ENTRY(GMSG_LOG_PING, gmsg_log_ping)
            key是網絡協議,value是對應的處理函數,對應的邏輯類是QLoggerHandler
            QLoggerHandler管理著LogServer唯一的socket句柄,連接建立后就做一件事,把接受到的數據塞到日志數據庫囧。
            日志服務器協議命令碼
            enum EServerLogProtocol
            {
            GMSG_LOG_SERVER_INFO = 1,
            LMSG_LOG_SERVER_CLOSE = 2,
            LMSG_LOG_SERVER_ERROR = 3,
            GMSG_LOG_ITEM = 4,//物品相關log
            GMSG_LOG_CHAT = 5,//聊天log
            GMSG_LOG_ACCOUNT = 6,//account活動log
            GMSG_LOG_SYS = 7,//系統警告log
            GMSG_LOG_PLAYER = 8,//玩家log
            GMSG_LOG_SAMPLE = 9,//玩家log
            GMSG_LOG_STAT = 10,//系統統計log
            GMSG_LOG_GM = 11,//gm log
            GMSG_LOG_QUEST = 12,//quest log
            GMSG_LOG_MAIL = 13,//mail log
            GMSG_LOG_SCRIPT = 14,//script log
            GMSG_LOG_CLIENT_WG = 15,//客戶端檢測外掛
            GMSG_LOG_TENCENT_CLIENT_WG = 16,//騰訊的檢測外掛log
            GMSG_LOG_PING = 17,//檢測LogServer是否死掉
            };
            編碼技巧:
            1.在網絡協議風暴解包中MSG_X系列宏算一個亮點。
            用法舉例:
            msg標識一個消息數據,實際上一個ACE_Message_Block
            MSG_NEW(MSG_OP_CODE, msg)  // 定義一個消息包,opcode是MSG_OP_CODE
            MSG_SET_STR(  // 調用ACE_Message_Block相關接口寫入需要攜帶的數據,數據大小變化會被ace自動感知到
            MSG_DEL(smsg);  // 銷毀消息
            2.利用map做的消息映射表:
            #define QLOG_MSG_MAP_BEGIN \
            class __LOG_MSG_MAP__{ public:__LOG_MSG_MAP__(); }; \
            static __LOG_MSG_MAP__  __log_msg_map__; \
            __LOG_MSG_MAP__::__LOG_MSG_MAP__(){ \
            QLoggerHandler::msg_map_.clear();
            #define QLOG_MSG_ENTRY( QMSG, FUNC ) \
            if(QLoggerHandler::msg_map_.find(QMSG)==QLoggerHandler::msg_map_.end()) \
            { QLoggerHandler::msg_map_.insert(QLoggerHandler::Msg_Map::value_type(QMSG,QLoggerHandler::FUNC));}
            #define QLOG_MSG_MAP_END }
            #define QLOG_MSG_ENTRY( QMSG, FUNC ) bool FUNC( ACE_Message_Block* msg );
            這種設計要求網絡響應函數參數是一致的,函數內部各自做解包操作。
            3.統一分離出來的數據庫操作:
            class DBProxy
            {
            public:
            static bool save_sys_log(const char* sys_l
            static bool save_item_log(const char* serv
            int left_credit,int item_guid,int item
            static bool save_gm_log(int gm_log_type, c
            static bool save_chat_log(int chat_type,co
            static bool save_account_log( int log_type
            static bool save_player_log(int log_type,c
            static bool save_sample_log(int log_type,c
            static bool save_stat_log(const char* serv
            static bool save_quest_log(int log_type, c
            static bool save_mail_log(int log_type, co
            static bool save_script_log(int log_type, 
            const char* log_p_2,const char* log_p_
            static bool save_tencent_wg_log(const char
            };
            #endif//__DBProxy_H_
            整個設計顯得非常清晰:
            QLoggerHandler接受到網絡消息通過映射表static Msg_Map msg_map_;分解到各自的解包函數,然后通過DBProxy執行最終的數據庫操作。
            posted @ 2015-03-18 00:26 Enic 閱讀(226) | 評論 (0)編輯 收藏

            GatewayManager(網關管理器)
            起初我以為這是一個單獨的進程,專門用來管理網關,后來發現他實際上是被編譯為".lib"的。
            代碼開起來很簡單,除了協議一共三只有三個類:GatewatManager、GWClientProxy、GWSVProxy
            猜測一下:
            GWClientProxy表示在Gateway上的客戶端
            GWSVProxy表示服務器
            GatewayManager做協調邏輯
            簡單瀏覽了一下代碼實際應該是這樣:
            GatewayManager、GWClientProxy猜對了,而GWSVProxy標識的是GatewayServer。這樣來看在GatewayManager的抽象中GatewayServer、Client都是獨立的實體,可以通過代理做到直接訪問。
            整個網關的設計,應該是一個邏輯服務器做為一個GatewayManager連接并管理了多個GateWayServer來負載自己的并發連接數,同時提供了GWSVProxy和GWClientProxy來實現“透明控制”
            GatewayManager類分析:
            1.從GatewayManager可以獲取到GWClientProxy,可以通過GUID來獲取
            2.GatewayManager能感知到新的客戶端連接事件,事件參數包括實際連接客戶端的GWSVProxy和客戶端在該網關上的id,以及客戶端實際連接地址
            3.GatewayManager能感知到新的網關服務器連接事件
            一句話描述GatewayManager的功能:
            直接和網關服務器連接,管理網關服務器,透過網關服務器直接訪問、管理客戶端連接。
            posted @ 2015-03-17 23:22 Enic 閱讀(315) | 評論 (0)編輯 收藏

            星座物語客戶端分析---01物品編輯器
            一、整體設計思路猜測
            1.前期目標數據結構盡可能單一化,配置化。
            2.盡可能讓程序和策劃的接口無人化,工具化,歸納需求以后程序提供工具給策劃人員。
            二、數據結構分析
            所有的道具都被冗余到同一個數據結構中了。
            優勢:編碼、和配置文件的制作上非常方便
            劣勢:內存略高,后期編碼肯能會有負擔
            *所有游戲世界中任何道具都可以用_ITEM_TABLE結構體來描述
            三、類型邏輯分析
            目前分析到的代碼,可以看出來,道具是“二級”分類,前期考慮也不夠充分,后面添加的代碼略顯混亂。
            第一級:醫療道具、裝備道具、輔助道具、任務道具(道具觸發任務、道具觸發技能、道具觸發循環任務)
            第二級:
              醫療道具二級分類:HP、MP、HPMP、Fealty(寵物忠誠度)、Health
              裝備道具二級分類:武器、頭部、衣服、手套、鞋子、項鏈、戒子、肩部
              *任務道具二級分類(實際代碼被卸載一級分類中了):道具觸發任務、道具觸發循環任務
              *輔助道具二級分類(實際代碼被卸載一級分類中了):道具觸發技能、ect.
            四、細節分析:
            1.對武器強化(打寶石,打孔)的支持不夠好。
            猜測_ITEM_TABLE.nNextLevel用于支持強化。實際使用可能強化前,和強化后是完全不同的兩個物品,通過nNextLevel關聯起來。這種設計中每個武器只要是同一類型,那么一定是統一屬性的。
            一個更好的方案是,給每個武器一個GUID,然后可以為武器添加全局唯一的屬性,方便“小極品”,允許更多個性化的存在,同時也可以更好的追蹤物品的交易流轉。這樣需要一個查詢效率足夠高的數據庫來保存游戲中每一個物品的數據。目測可以用KV來解決。如果查詢壓力太大,可以允許數據冗余,將道具的GUID數據和持有玩家綁定起來,一個玩家ID可以批量查詢出其對應的所有道具的GUID數據,直接用blob字段保存起來,同時GUID字段作為日志表保持,只在發生更改的時候才會有寫操作。或者這部分數據用KV數據庫系統保存。
            2.有沒有辦法把_ITEM_TABLE結構體拆分,或者把道具做的靈活一點,變成組建系統或者屬性系統。
            比如:道具看成是一個組建/屬性容器,放了一個裝備組建進去他就具有裝備的功能,放了一個醫療屬性就是一個醫療物品。這樣道具可以更加靈活,比如:將一個裝備作為藥品吃掉。(這個時候一級類型不再是類型,而是屬性,具有裝備道具屬性同時具有道具類型屬性)
            3.降內存
            使用protobuf代替直接使用結構體會不會好一點?_ITEM_TABLE中還使用了std::string作為字段,一個不小心memset就會掛掉。此外protobuf的優勢還有支持optional等配置,可能會有優勢,比如不用更具一級類型去復用二級類型的字段,而是將不同的部分獨立出來作為optional字段。
            五、道具屬性
            基礎屬性(三圍數據):力量(Strength)、敏捷(Agility)、耐力(Stamina)、精神(Energy)、智力(Intellect)、物攻(Attack)、魔攻(Magic)、物防(Recovery)、魔防(Mrecovery)、攻速(AckSpeed)、準確(Nicety)、躲閃(Dodge)
            MP、HP
            體力消耗
            磨損
            價格
            職業
            ect.待續,改天直接分析策劃案子,這個樣子太累
            posted @ 2015-03-16 17:43 Enic 閱讀(319) | 評論 (1)編輯 收藏

            網關服務器入網流程:
            s1.連接網關管理器
            s2.上報自身信息給網關管理器
            s3.從網關管理器獲取自己的管理信息
            *s4.按照管理信息預分配好需要的資源
            s5.網關服務器打開客戶端監聽端口
            s6.網關服務器開始轉發“管理器”和客戶端的數據
            *網關服務器完全不理解來自客戶端的數據(對客戶端而言是透明的)
            *網關服務器和“管理器”之間存在協議棧,有五個高級命令:轉發,廣播轉發,T下線1,T下線2,關閉網關
            *網關服務器會定時給“管理器”發送心跳請求ping
            *網關服務器會維護客戶端狀態機:Freed、Starting、InUse、Stoping
            GateWayServer抽象網關邏輯以及和管理器的連接,處理管理器命令,并且轉發客戶端和管理器的消息
            GWClient抽象網關到客戶端連接,負責處理網關和客戶端的邏輯
            網關啟動后,GateWayServer會打開監聽端口,當新的連接上來以后,會創建一個新的GWClient對象,并且將新的socket連接郊游GWClient管理。GWClient管理客戶端和網關服務器之間的通訊數據:接受到客戶端的數據會交由GameWayServer對象轉發到指定的管理器,GameWayServer也會將管理器發送給客戶端的數據交由GWClient發送到客戶端。
            即在網關服務器內部:GWClient做為客戶端的代理,GateWayServer做為管理器(邏輯服務器)的代理。
            // 禁用nagles算法
            int nodelay = 1;
            if(ACE_OS::setsockopt(new_handle,IPPROTO_TCP, TCP_NODELAY,(char*)&nodelay,sizeof(nodelay))==-1)
            {
            ACE_ERROR( ( LM_ERROR, ACE_TEXT("Set socket TCP_NODELAY failed!!\n")) );
            }
            缺陷:
            1.缺少對客戶端的安全檢測,也許是放到后面的邏輯服務器上去做了。不能排除惡意連接,或者誤操作的連接,所有的連接都被accept上來,然后做數據交換。
            2.數據的分發上,好像一個網關服務器只能對應一個管理器(邏輯服務器)
            3.網關只能標識到連接(SettionID是用戶邏輯無關的),無法識別到具體邏輯客戶端
            嘗試做低級抽象:
            IGateWayClientAccpetor
              OnClientAccept
            IGateWay2ClientSession
              SessionID
              OnConnect
              OnRead
              OnWrite
            IGateWay2ManagerSession
              SessionID
              OnConnect
              OnRead
              OnWrite
              
            IGateWayDataRouter
              OnAccessRouting(IGateWay2ClientSession)
              OnAccessRouting(IGateWay2ManagerSession)
              OnGateWay2ClientSessionRead(來自客戶端的數據,當前代碼下,會轉發給唯一的管理器處理)
              OnGateWay2ManagerSession(來自管理器的數據,如果是需要轉發給客戶端的數據,會包含有客戶端SessionId)

            協議概覽:
            網關管理服務器 協議:
            enum EGWMgrMsgType
            {
            GWMMT_Msg, // Route server msg to clients.
            GWMMT_MsgAll, // Route server msg to all clients.
            GWMMT_Droped, // *A client has been droped by manager( actively or disconnect ack ).
            GWMMT_DropedDiscard, // *A client has been droped by manager( actively or disconnect ack ).
            GWMMT_Shutdown, // Shutdown gateway server.
            GWMMT_Max,
            };
            GWMMT_Msg: 轉發消息到指定客戶端
            GWMMT_MsgAll: 轉發廣播消息到全部客戶端
            GWMMT_Droped: 網關管理器T掉指定客戶端
            GWMMT_DropedDiscard: 網關管理器T掉指定客戶端
            GWMMT_Shutdown: 關閉網關服務器
            ---------------------------------------------------------------------------------------
            網關服務器 協議:
            enum EGWSVMsgType
            {
            GWSMT_CLJoin, // New client join.
            GWSMT_CLDisconnected, // Client disconnected.
            GWSMT_Msg, // Route client message to server.
            GWSMT_Ping, // gateway ping message to server.
            GWSMT_Max,
            };
            GWSMT_CLJoin: 新連接客戶端
            GWSMT_CLDisconnected: 客戶端連接斷開
            GWSMT_Msg: 將客戶端的消息轉發到服務器
            GWSMT_Ping: 網關服務器到邏輯服務器的ping
            -----------------------------------------------------------------------------------
            網關服務器消息頭:
            struct GWMsgHdr
            {
            GWMsgHdr( u_int type, u_int len ):type_( type ), data_len_(len){}
            u_int type_; // Msg type.
            u_int data_len_; //
            };
            ------------------------------------------------------------------------------------
            網關上報給網關管理器的自身信息
            struct GWLocalInfo  // 監聽客戶端連接的endpoint
            {
            u_int addr_; // Gateway listen address.
            u_short port_;
            };
            ------------------------------------------------------------------------------------
            網關從網關管理器接受的信息
            struct GWInfo
            {
            u_int id_; // Gateway server id.
            u_int cl_num_; // Client num.
            };

            設計特點:
            1.啟動參數通過內存共享,本地,可以被其他程序訪問到,也許直接被共享到集群了,沒有深入去看
            posted @ 2015-03-15 22:24 Enic 閱讀(289) | 評論 (0)編輯 收藏

             64位windows平臺,編譯環境是VS2005,進入Visual Studio 2005 x64 Win64 Command Prompt(單純的cmd也不一定不行,我沒試)。把bjam.exe放在boost根目錄下,進入根目錄,執行:

                bjam --toolset=msvc address-model=64 --with-thread stage
                bjam --toolset=msvc address-model=64 --with-date_time stage
                關鍵選項:“address-model=64 ”
                64位Linux平臺,使用gcc編譯。進入boost根目錄,執行:
                ./bjam --toolset=gcc --with-thread stage
                ./bjam --toolset=gcc --with-date_time stage
                linux平臺下倒是簡單,不過網上有篇文章介紹用如下命令編譯,不知道是多此一舉,還是適用于某些情況(非64位linux主機?)。
                ./bjam --toolset=gcc "-sBUILD=release <cxxflags>-m64" --with-thread stage
                ./bjam --toolset=gcc "-sBUILD=release <cxxflags>-m64" --with-date_time stage
             
                唉。命令都很簡單,可浪費了我不少時間。usage根本沒寫,去看boost build的嘛,頁數n多不說,看完之后能否找到答案還是未知數。網上相關資料很少而且大多南轅北轍,只好一直搜索+嘗試。其實我只是想要個64位版本的庫而已,這應該不是啥稀罕的需求吧?
               在windows平臺下,編譯出來的是否是64位類庫,只有link 64位程序的時候才能發現。如果不是,link程序無法找到類庫中定義的函數或者類。linux不知道,因為我整出來直接就是64位了,我也懶得再找一臺32位linux主機折騰了。
            posted @ 2015-03-08 17:57 Enic 閱讀(370) | 評論 (0)編輯 收藏

            并發編程幾個基礎庫:
            C++ REST SDK

            C++ PPL
            C++ TBB

            OpenMP
            OpenAMP
            OpenCL
            CUDA

            posted @ 2015-02-10 19:03 Enic 閱讀(135) | 評論 (0)編輯 收藏

            前言

                在大家使用github的過程中,一定會碰到這樣一種情況,就是每次要push 和pull時總是要輸入github的賬號和密碼,這樣不僅浪費了大量的時間且降低了工作效率。在此背景下,本文在網上找了兩種方法來避免這種狀況,這些成果也是先人提出來的,在此只是做個總結。

            1.方法一 

            1.1 創建文件存儲GIT用戶名和密碼

            在%HOME%目錄中,一般為C:\users\Administrator,也可以是你自己創建的系統用戶名目錄,反正都在C:\users\中。文件名為.git-credentials,由于在Window中不允許直接創建以"."開頭的文件,所以需要借助git bash進行,打開git bash客戶端,進行%HOME%目錄,然后用touch創建文件 .git-credentials, 用vim編輯此文件,輸入內容格式:

            touch .git-credentials

            vim .git-credentials

            https://{username}:{password}@github.com

            1.2 添加Git Config 內容

            進入git bash終端, 輸入如下命令:

            git config --global credential.helper store

            執行完后查看%HOME%目錄下的.gitconfig文件,會多了一項:

            [credential]
            
                helper = store
            

            重新開啟git bash會發現git push時不用再輸入用戶名和密碼

            2.方法二

            2.1 添加環境變量

            在windows中添加一個HOME環境變量,變量名:HOME,變量值:%USERPROFILE%

            2.2 創建git用戶名和密碼存儲文件

            進入%HOME%目錄,新建一個名為"_netrc"的文件,文件中內容格式如下:

            machine {git account name}.github.com
            login your-usernmae
            password your-password
            

            重新打開git bash即可,無需再輸入用戶名和密碼

            posted @ 2015-01-31 12:59 Enic 閱讀(174) | 評論 (0)編輯 收藏

            個人的成功:從依賴到獨立
            習慣一:積極主動——個人愿景的原則
            習慣二:以終為始——自我領導的原則
            習慣三:要事第一——自我管理的原則
            第三部分 公眾的成功:從獨立到互賴
            習慣四:雙贏思維——人際領導的原則
            習慣五:知彼知己——同理心交流的原則
            習慣六:統合綜效——創造性合作的原則
            習慣七:不斷更新——平衡的自我更新的原則
            再次由內而外造就自己
            posted @ 2015-01-27 10:24 Enic 閱讀(116) | 評論 (0)編輯 收藏

            隱藏MFC對話框程序主窗口:
            1.不在桌面任務欄顯示
            ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);
            2.使用SetPos設置0
            ::SetWindowPos(m_hWnd, NULL, 0, 0, 0, 0, 0);

            關閉主窗口對話框:
            CDialog* pDlg =reinterpret_cast<CDialog*>(AfxGetApp()->GetMainWnd());
              pDlg->EndDialog(IDOK);

            posted @ 2015-01-19 19:34 Enic 閱讀(487) | 評論 (0)編輯 收藏

            僅列出標題
            共22頁: First 3 4 5 6 7 8 9 10 11 Last 
            日本免费久久久久久久网站| 伊人久久大香线蕉AV一区二区 | 蜜臀av性久久久久蜜臀aⅴ麻豆| 无码任你躁久久久久久老妇| 久久免费看黄a级毛片| 国内精品人妻无码久久久影院导航| 亚洲精品乱码久久久久66| 亚洲国产精品无码久久久蜜芽 | 日韩精品无码久久一区二区三| 久久无码国产| 国内精品久久久久久野外| 久久久久久毛片免费看| 亚洲香蕉网久久综合影视| 久久夜色tv网站| 亚洲中文字幕无码久久综合网| 亚洲国产精品久久久久婷婷老年| 欧美激情精品久久久久久| 久久精品国产清高在天天线| 性高朝久久久久久久久久| 99国产精品久久| 狠狠色噜噜色狠狠狠综合久久| 久久国产成人精品麻豆| 热99RE久久精品这里都是精品免费 | 精品久久久久久久久久久久久久久| 亚洲国产综合久久天堂| 7国产欧美日韩综合天堂中文久久久久 | 91精品婷婷国产综合久久| 7777久久久国产精品消防器材| 国产精品热久久毛片| 久久99精品国产麻豆| 久久精品国产亚洲AV久| 青青青青久久精品国产h久久精品五福影院1421 | 午夜福利91久久福利| 99久久精品免费看国产一区二区三区 | 久久精品国产AV一区二区三区| 精品久久国产一区二区三区香蕉| 亚洲中文字幕无码久久综合网| 日本高清无卡码一区二区久久 | 97久久香蕉国产线看观看| 亚洲愉拍99热成人精品热久久| 亚洲国产视频久久|