- 完全解决IndexError: index 0 is out of bounds for axis 1 with size 0
阿立聊全栈
排错java算法数据结构
1.解决问题IndexError:index0isoutofboundsforaxis1withsize02.解决思路索引错误:索引0超出了大小为0的轴1的范围。错误信息中提到了axis1。轴1通常表示二维数组中的列。它说axis1的size是0。意思是该数组没有任何列(列数为0)。但是你试图访问index为0的位置,也就是第一列。所以问题就出在,你试图访问一个不存在的索引位置。一些可能的原因和解
- CPP语法(二)——CPP指针
monGyrate
CPP语法c++开发语言
CPP语法二目录一、指针1.1指针初始化1.2空类型指针1.3野指针1.4指针常量1.5常量指针1.6指向常量的指针常量1.7指针和一维数组1.7.1指针操作数组说明1.8指针和二维数组1.9数组指针和指针数组1.10指针与字符数组1.11指针函数和函数指针1.12空指针调用函数1.12.1指针做返回值1.13指针数组1.14安全使用指针1.14.1内存分配1.14.2堆内存释放***注意指针只能
- 鸿蒙HarmonyOS NEXT开发:简易五子棋小游戏的实现(悔棋、重开、胜利判断)
淡 忘
ArkTS交互华为harmonyos
效果图:主组件中状态变量定义模块:先定义每一行棋的对象DraughtBoard(因为使用@StateUI无法检测到二维数组的数值变化)@ObservedclassDraughtBoardextendsArray{}@Stateplayer:boolean:这是一个关键的状态变量,决定了当前轮到哪一方下棋。true表示当前轮到黑棋,false则表示轮到白棋。其初始值被设定为true,这意味着在游戏开
- 鸿蒙HarmonyOS NEXT开发:简易2048小游戏的实现
淡 忘
ArkTS交互华为harmonyos
效果图:为何使用全局变量而不直接在状态变量中使用二维数组:在ArkTS中,使用@State修饰器,二维数组中的某个数字发生改变时,UI是无法监听到的,导致不能实时渲染,因此定义一个二维的全局变量arr[][]作为"中介",操作时是对arr[][]进行操作,操作后对每一行进行赋值,即可让UI监听到。若要UI监听到二维数组的变化,则需使用@Observed和@ObjectLink配合使用,可参考简易五
- Scala(多维数组)
直裾
scala开发语言后端
最典型的的多维数组就是二维数组。objecttest3{defmain(args:Array[String]):Unit={//二维数组//2.1创建方式1valarr5=Array.ofDim[Int](2,2)//2行2列//2.2访问数组的元素arr5(0)(0)=1arr5(0)(1)=2arr5(1)(0)=3arr5(1)(1)=4//2.3把一维数组转化成二维数组vararr6=Ar
- 编程速记(31):np.dot的理解
Leeyegy
编程速记
一、简述如果是两个一维数组,那么np.dot返回的是两个数组的内积(逐元素对应相乘最后求和)。如果是两个二维数组,那么np.dot返回的是矩阵乘法的结果。二、参考:https://www.cnblogs.com/luhuan/p/7925790.html
- 【2025年虾皮春招(开发岗)-4月2日-第一题(100分)- 二叉树遍历】(题目+思路+Java&C++&Python解析+在线测试)
塔子哥学算法
javac++python算法数据结构虾皮
题目内容给你一个全部节点是正整数的二叉树,逐层的从左到右访问所有节点,输出为一个二维数组;注:#代表该节点没有值输入描述一行包含二叉树的层次遍历结果,节点值之间用空格隔开,空节点用#表示。例如:输入二叉树:42119##184/\2119/\18输出描述每层一行输出,一行里的数字之间以空格分隔。(不输出空节点)样例1输入52011#7输出520117样例2输入1123#7789输出
- C语言——八股文(笔试面试题)——持续更新
墨染新瑞
笔试题c语言开发语言
目录目录更新日历:1、什么是数组指针,什么是指针数组?2、什么是位段,什么是联合体3、什么是递归,什么是回调?4、什么是越界,什么是溢出?5、#define和typedef的区别?6、Static与extern的作用?7、二级指针和二维数组有什么关系?8、栈内存,堆内存,数据区有啥区别?9、负数及浮点型数据在内存中是如何存放的?10、如何在代码中打印所在文件名,函数名及行号?11、局部变量能否和全
- 精通Python(66)
程序员老孙
人工智能python开发语言pandas
深入浅出pandas-2如果使用pandas做数据分析,那么DataFrame一定是被使用得最多的类型,它可以用来保存和处理异质的二维数据。这里所谓的“异质”是指DataFrame中每个列的数据类型不需要相同,这也是它区别于NumPy二维数组的地方。DataFrame提供了极为丰富的属性和方法,帮助我们实现对数据的重塑、清洗、预处理、透视、呈现等一系列操作。创建DataFrame对象通过二维数组创
- python二维数组单个元素赋值
lalapanda
pythonlist
当你用如下方法创建一个python二维数组时memo=[[1]*3]*4于是你得到memo=[[1,1,1],[
- 3.27学习总结 爬虫+二维数组+Object类常用方法
张张张312
学习java
高精度:一个很大的整数,以字符串的形式进行接收,并将每一位数存储在数组内,例如100,即存储为[1][0][0]。p2437蜜蜂路线每一个的路线数==前两个数的路线数相加。#includeinta[1005][1005];intn,m,length=1;//初始长度为1voidyyc(ints){for(inti=1;i9){a[s][i+1]+=a[s][i]/10;a[s][i]%=10;if
- Java中数组的使用(一维数组和二维数组)
棐木
java开发语言
文章目录Java中数组的使用1.数组的使用方式1.1数组的定义1.1.1动态初始化1.1.2静态初始化1.2数组使用的注意事项和细节1.3数组的赋值机制1.4数组添加/扩容2.二维数组的使用2.1二维数组的内存形式2.2二维数组的定义2.2.1动态初始化2.2.2静态初始化2.3二维数组的注意事项及细节Java中数组的使用1.数组的使用方式1.1数组的定义1.1.1动态初始化数据类型数组名[]=n
- 一维数组和二维数组
想要成为计算机高手
c语言笔记经验分享开发语言
目录1.一维数组的创建和初始化1.1数组的创建1.2数组的初始化1.3一维数组的使用1.4一维数组在内存中的存储2.二维数组的创建和初始化2.1二维数组的创建2.2二维数组的初始化2.3二维数组的使用2.4二维数组在内存中的存储3.数组越界4.数组作为函数参数4.1冒泡排序的错误设计4.2数组名是什么4.3冒泡排序函数的正确设计1.一维数组的创建和初始化1.1数组的创建数组是一组相同类型元素的集合
- 【Numpy】入门常犯错误
爱学习的capoo
numpypython开发语言
【入门】常见错误错误题目分析27.反转二维数组的行顺序arr1=arr1[::-1]#✅正确方法(反转行)arr1=arr1[:,::-1]#❌这是反转列,不是题目要求的反转行问题:第二个操作[:,::-1]会反转列顺序,不符合题目要求正确做法:只需使用arr1[::-1]即可反转行顺序34.将一维数组的第2到第4个元素设置为10arr2=np.arange([1,2,3,3,2,1])#❌语法错
- D2_1matlab数组基本操作
Seven_doctor
算法matlab学习
一、创建数组1.直接赋值法%创建行向量row_vector=[1,2,3,4,5];%创建列向量column_vector=[1;2;3;4;5];%创建二维数组matrix=[1,2,3;4,5,6;7,8,9];%创建一个2*2*2的三维数组highD_array=[[1,2;3,4],[5,6;7,8]];%创建一个2*2*2的三维数组suzu(2,2,2)=02.冒号运算符(等差数列行向量
- 力扣杨辉三角c语言,杨辉三角
我的小多
力扣杨辉三角c语言
分类:二维数组及滚动数组题目描述:给定一个非负整数numRows,生成杨辉三角的前numRows行。在杨辉三角中,每个数是它左上方和右上方的数的和。解题思路1:在杨辉三角中,每个数是它左上方和右上方的数的和。题目给的这一句话提示就够了。稍微麻烦的是要考虑头尾为1的情况那不如杨辉三角经典算法大总结(Java版)2021-05-0320:57:33前言杨辉三角,也叫贾宪三角,帕斯卡三角。最早出现于北宋
- 代码随想录动态规划2
Naive_7
动态规划算法
62.不同路径代码随想录视频讲解:动态规划中如何初始化很重要!|LeetCode:62.不同路径_哔哩哔哩_bilibili一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?思路:首先需要一个二维数组记录坐标(i,j),再思考走到终点dp[m-1][
- Java基础 3.28
anlogic
javajava
1.二维数组从形式上定义看int[][]原来的一维数组的每个元素是一维数组,就构成了二维数组intarr[][]={{0,0,0,0},{0,1,1,1},{0,0,0,0},{0,1,1,1}};关于二维数组的关键概念二维数组的元素个数为arr.length二维数组的每个元素是一堆数组,所有如果需要得到每个一维数组的值还需要再次遍历如果我们要访问第(i+1)个一维数组的第(j+1)个值arr[i
- 【数组】复习与企业真题
小赵要加油
javajava开发语言
目录数组概述一维数组的使用(重要)二维数组的使用(难点)数组的常用算法Araays工具类的使用数组中的常见异常企业真题数组概述数组,就可以理解为多个数据的组合是程序中的容器:数组、集合框架(List、Set、Map)数组存储的数据的特点:依次紧密排序的,有序的,可以重复的此时的数组、集合框架都是在内存中对多个数据存储数组的其他特点:一旦初始化,其长度就是确定的、不可更改的一维数组的使用(重要)数组
- 0-1背包问题,使用动态规划的三种方法(二维数组,两个一维数组,一个一维数组)python实现
路漫漫`
leetcodePython算法动态规划python
0-1背包问题感谢这些朋友们的文章,给了我很大启发:https://blog.csdn.net/songyunli1111/article/details/94778914https://blog.csdn.net/na_beginning/article/details/62884939https://blog.csdn.net/qq_39445165/article/details/84334
- Day42代码随想录动态规划part04:01背包问题的二维数组解法、01背包问题的一维数组解法、416. 分割等和子集
Estrellazhu
动态规划算法pythonleetcode
Day42动态规划part03-01背包问题01背包问题的二维数组解法01背包问题定义:有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。暴力解法:回溯法,枚举所有情况,每个物品是取与不取两个状态二维数组方法dp数组的含义:二维dp[i][j]数组:[0,i]之间的物品任取,放入
- 代码随想录算法训练营第五十二天(图论)| 98. 所有可达路径、深度优先搜索、广度优先搜索
*MaybE
算法算法图论
邻接矩阵邻接矩阵是一种使用二维数组来表示图的方法。矩阵中的元素表示节点之间是否存在边。如果存在边,则对应的矩阵元素为1(或边的权重);否则为0。特点:空间复杂度高:无论图是否稀疏,邻接矩阵都需要O(V^2)的空间,因为每个节点都需要为所有其他节点预留位置。查找效率高:查找任意两节点之间是否存在边非常高效,只需要访问一次数组,时间复杂度为O(1)。不适合稀疏图:对于边远少于顶点平方的稀疏图,邻接矩阵
- Java基础09:ArrayList集合
XXXZhy
JAVA基础笔记JAVA
系列文章目录Java基础01:JAVA概述、基础语法Java基础02:运算符、流程控制语句、Random随机数Java基础03:IDEA、快捷键Java基础04:数组、二维数组Java基础05:方法Java基础06:Debug、进制Java基础07:面向对象基础Java基础08:API、字符串String、StringBuilderJava基础09:ArrayList集合Java基础作业文章目录系
- java从键盘输入数组、字符串、字符串数组,获取二维数组的行列数
HH~LL
java学习记录
1、从键盘输入一维数组Scannerscanner=newScanner(System.in);intn=scanner.nextInt();//数量System.out.println("请输入"+n+"个孩子的饥饿度:");Scannersc=newScanner(System.in);int[]b=newint[n];for(inti=0;i
- Python---数据分析(Pandas十一:二维数组DataFrame统计计算二)
蹦蹦跳跳真可爱589
数据分析Pythonpandaspython数据分析
1、std用于计算DataFrame中数值的标准差。DataFrame.std(axis=0,skipna=True,ddof=1,numeric_only=False,**kwargs)描述说明axis{0或‘index’,1或‘columns’,None},默认为0。这个参数决定了计算标准差是在哪个轴上进行:如果axis=0或axis='index',则对每列进行计算,返回一个Series,其
- 代码随想录算法训练营第二十三天 | 回溯算法part02| 39. 组合总和、40.组合总和II、131.分割回文串
boguboji
刷题算法数据结构
39.组合总和这道题和前面组合问题的区别是,取的元素可以重复,也就是遍历的时候,同一个元素可以一直取。所以for循环里,逐个添加元素,判断和大于目标时break(否则会一直加)还是新建二维数组放结果,一维数组放path。输入参数为放结果数组、path、提供的数组、目标值、目前总和sum、startIndex提前把提供的数组排序,用Arrays.sort()这样sum超过target就break递归
- 1242: 二维数组输出(2)
呱呱呱~
算法
题目描述输入一个整数N,输出一个N行N列的二维矩阵,矩阵中的元素按列用1——N*N顺序填充。输入一个整数N(Nusingnamespacestd;intmain(){intN;cin>>N;//创建一个NxN的二维数组intmatrix[N][N];//按列填充数字for(intcol=0;col
- 蓝桥杯真题 3513.岛屿个数
Feliz..
dfs和bfs算法深度优先
原题地址:1.岛屿个数-蓝桥云课问题描述小蓝得到了一副大小为M×NM×N的格子地图,可以将其视作一个只包含字符'0'(代表海水)和'1'(代表陆地)的二维数组,地图之外可以视作全部是海水,每个岛屿由在上/下/左/右四个方向上相邻的'1'相连接而形成。在岛屿AA所占据的格子中,如果可以从中选出kk个不同的格子,使得他们的坐标能够组成一个这样的排列:(x0,y0),(x1,y1),…,(xk−1,yk
- C语言复习笔记5---数组
.又是新的一天.
C语言复习笔记c语言算法c++
数组考点排序冒泡排序O(n^2)选择排序O(n^2)(插入排序)分离每一位正序逆序哈希(hash)→用值直接作为下标日期处理问题数组的基本操作插入和删除逆序(移位)7-19田忌赛马(双指针)二维数组→矩阵矩阵转置判断对称矩阵矩阵运算矩阵移位杨辉三角*知识点数组:存储若干个相同的数据类型的元素intchardoublefloatlonglong定义数组数据类型数组名[数组大小]inta[100];数
- 图论:以二维数组表示的连通图/树应如何表示?leetcode1042.不邻接种花
坠金
技术面算法图论算法leetcode
1042.不邻接植花-力扣(LeetCode)容器在这道题中输入类似[[1,2],[3,4]],这意味着花园1连通了花园2,花园3连通了花园4。那么该怎么根据这个输入,获取一个方便后面算法的表示呢?我们通常管这种存放邻居的数据格式叫做:邻接表通常我的思路是使用下列容器作为邻接表:哈希表,key就是花园i,value是与花园i接壤的其他所有花园。二维数组,第i个数组中的元素是与花园i接壤的其他所有花
- ios内付费
374016526
ios内付费
近年来写了很多IOS的程序,内付费也用到不少,使用IOS的内付费实现起来比较麻烦,这里我写了一个简单的内付费包,希望对大家有帮助。
具体使用如下:
这里的sender其实就是调用者,这里主要是为了回调使用。
[KuroStoreApi kuroStoreProductId:@"产品ID" storeSender:self storeFinishCallBa
- 20 款优秀的 Linux 终端仿真器
brotherlamp
linuxlinux视频linux资料linux自学linux教程
终端仿真器是一款用其它显示架构重现可视终端的计算机程序。换句话说就是终端仿真器能使哑终端看似像一台连接上了服务器的客户机。终端仿真器允许最终用户用文本用户界面和命令行来访问控制台和应用程序。(LCTT 译注:终端仿真器原意指对大型机-哑终端方式的模拟,不过在当今的 Linux 环境中,常指通过远程或本地方式连接的伪终端,俗称“终端”。)
你能从开源世界中找到大量的终端仿真器,它们
- Solr Deep Paging(solr 深分页)
eksliang
solr深分页solr分页性能问题
转载请出自出处:http://eksliang.iteye.com/blog/2148370
作者:eksliang(ickes) blg:http://eksliang.iteye.com/ 概述
长期以来,我们一直有一个深分页问题。如果直接跳到很靠后的页数,查询速度会比较慢。这是因为Solr的需要为查询从开始遍历所有数据。直到Solr的4.7这个问题一直没有一个很好的解决方案。直到solr
- 数据库面试题
18289753290
面试题 数据库
1.union ,union all
网络搜索出的最佳答案:
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
2.索引有哪些分类?作用是
- Android TV屏幕适配
酷的飞上天空
android
先说下现在市面上TV分辨率的大概情况
两种分辨率为主
1.720标清,分辨率为1280x720.
屏幕尺寸以32寸为主,部分电视为42寸
2.1080p全高清,分辨率为1920x1080
屏幕尺寸以42寸为主,此分辨率电视屏幕从32寸到50寸都有
适配遇到问题,已1080p尺寸为例:
分辨率固定不变,屏幕尺寸变化较大。
如:效果图尺寸为1920x1080,如果使用d
- Timer定时器与ActionListener联合应用
永夜-极光
java
功能:在控制台每秒输出一次
代码:
package Main;
import javax.swing.Timer;
import java.awt.event.*;
public class T {
private static int count = 0;
public static void main(String[] args){
- Ubuntu14.04系统Tab键不能自动补全问题解决
随便小屋
Ubuntu 14.04
Unbuntu 14.4安装之后就在终端中使用Tab键不能自动补全,解决办法如下:
1、利用vi编辑器打开/etc/bash.bashrc文件(需要root权限)
sudo vi /etc/bash.bashrc
接下来会提示输入密码
2、找到文件中的下列代码
#enable bash completion in interactive shells
#if
- 学会人际关系三招 轻松走职场
aijuans
职场
要想成功,仅有专业能力是不够的,处理好与老板、同事及下属的人际关系也是门大学问。如何才能在职场如鱼得水、游刃有余呢?在此,教您简单实用的三个窍门。
第一,多汇报
最近,管理学又提出了一个新名词“追随力”。它告诉我们,做下属最关键的就是要多请示汇报,让上司随时了解你的工作进度,有了新想法也要及时建议。不知不觉,你就有了“追随力”,上司会越来越了解和信任你。
第二,勤沟通
团队的力
- 《O2O:移动互联网时代的商业革命》读书笔记
aoyouzi
读书笔记
移动互联网的未来:碎片化内容+碎片化渠道=各式精准、互动的新型社会化营销。
O2O:Online to OffLine 线上线下活动
O2O就是在移动互联网时代,生活消费领域通过线上和线下互动的一种新型商业模式。
手机二维码本质:O2O商务行为从线下现实世界到线上虚拟世界的入口。
线上虚拟世界创造的本意是打破信息鸿沟,让不同地域、不同需求的人
- js实现图片随鼠标滚动的效果
百合不是茶
JavaScript滚动属性的获取图片滚动属性获取页面加载
1,获取样式属性值
top 与顶部的距离
left 与左边的距离
right 与右边的距离
bottom 与下边的距离
zIndex 层叠层次
例子:获取左边的宽度,当css写在body标签中时
<div id="adver" style="position:absolute;top:50px;left:1000p
- ajax同步异步参数async
bijian1013
jqueryAjaxasync
开发项目开发过程中,需要将ajax的返回值赋到全局变量中,然后在该页面其他地方引用,因为ajax异步的原因一直无法成功,需将async:false,使其变成同步的。
格式:
$.ajax({ type: 'POST', ur
- Webx3框架(1)
Bill_chen
eclipsespringmaven框架ibatis
Webx是淘宝开发的一套Web开发框架,Webx3是其第三个升级版本;采用Eclipse的开发环境,现在支持java开发;
采用turbine原型的MVC框架,扩展了Spring容器,利用Maven进行项目的构建管理,灵活的ibatis持久层支持,总的来说,还是一套很不错的Web框架。
Webx3遵循turbine风格,velocity的模板被分为layout/screen/control三部
- 【MongoDB学习笔记五】MongoDB概述
bit1129
mongodb
MongoDB是面向文档的NoSQL数据库,尽量业界还对MongoDB存在一些质疑的声音,比如性能尤其是查询性能、数据一致性的支持没有想象的那么好,但是MongoDB用户群确实已经够多。MongoDB的亮点不在于它的性能,而是它处理非结构化数据的能力以及内置对分布式的支持(复制、分片达到的高可用、高可伸缩),同时它提供的近似于SQL的查询能力,也是在做NoSQL技术选型时,考虑的一个重要因素。Mo
- spring/hibernate/struts2常见异常总结
白糖_
Hibernate
Spring
①ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
缺少aspectjweaver.jar,该jar包常用于spring aop中
②java.lang.ClassNotFoundException: org.sprin
- jquery easyui表单重置(reset)扩展思路
bozch
formjquery easyuireset
在jquery easyui表单中 尚未提供表单重置的功能,这就需要自己对其进行扩展。
扩展的时候要考虑的控件有:
combo,combobox,combogrid,combotree,datebox,datetimebox
需要对其添加reset方法,reset方法就是把初始化的值赋值给当前的组件,这就需要在组件的初始化时将值保存下来。
在所有的reset方法添加完毕之后,就需要对fo
- 编程之美-烙饼排序
bylijinnan
编程之美
package beautyOfCoding;
import java.util.Arrays;
/*
*《编程之美》的思路是:搜索+剪枝。有点像是写下棋程序:当前情况下,把所有可能的下一步都做一遍;在这每一遍操作里面,计算出如果按这一步走的话,能不能赢(得出最优结果)。
*《编程之美》上代码有很多错误,且每个变量的含义令人费解。因此我按我的理解写了以下代码:
*/
- Struts1.X 源码分析之ActionForm赋值原理
chenbowen00
struts
struts1在处理请求参数之前,首先会根据配置文件action节点的name属性创建对应的ActionForm。如果配置了name属性,却找不到对应的ActionForm类也不会报错,只是不会处理本次请求的请求参数。
如果找到了对应的ActionForm类,则先判断是否已经存在ActionForm的实例,如果不存在则创建实例,并将其存放在对应的作用域中。作用域由配置文件action节点的s
- [空天防御与经济]在获得充足的外部资源之前,太空投资需有限度
comsci
资源
这里有一个常识性的问题:
地球的资源,人类的资金是有限的,而太空是无限的.....
就算全人类联合起来,要在太空中修建大型空间站,也不一定能够成功,因为资源和资金,技术有客观的限制....
&
- ORACLE临时表—ON COMMIT PRESERVE ROWS
daizj
oracle临时表
ORACLE临时表 转
临时表:像普通表一样,有结构,但是对数据的管理上不一样,临时表存储事务或会话的中间结果集,临时表中保存的数据只对当前
会话可见,所有会话都看不到其他会话的数据,即使其他会话提交了,也看不到。临时表不存在并发行为,因为他们对于当前会话都是独立的。
创建临时表时,ORACLE只创建了表的结构(在数据字典中定义),并没有初始化内存空间,当某一会话使用临时表时,ORALCE会
- 基于Nginx XSendfile+SpringMVC进行文件下载
denger
应用服务器Webnginx网络应用lighttpd
在平常我们实现文件下载通常是通过普通 read-write方式,如下代码所示。
@RequestMapping("/courseware/{id}")
public void download(@PathVariable("id") String courseID, HttpServletResp
- scanf接受char类型的字符
dcj3sjt126com
c
/*
2013年3月11日22:35:54
目的:学习char只接受一个字符
*/
# include <stdio.h>
int main(void)
{
int i;
char ch;
scanf("%d", &i);
printf("i = %d\n", i);
scanf("%
- 学编程的价值
dcj3sjt126com
编程
发一个人会编程, 想想以后可以教儿女, 是多么美好的事啊, 不管儿女将来从事什么样的职业, 教一教, 对他思维的开拓大有帮助
像这位朋友学习:
http://blog.sina.com.cn/s/articlelist_2584320772_0_1.html
VirtualGS教程 (By @林泰前): 几十年的老程序员,资深的