My life of programming Java & Linux

本文记录了一位大学生从初学者到掌握Java和Linux的过程。分享了他对编程的热爱,如何自学Java并深入理解面向对象编程,以及从Windows转向Linux的体验。

My life of programming Java & Linux

Written on 2014.01.24一个很无聊很无聊的晚上
Modifed on 2014.03.08一个不想学习兼断网的下午
Continue on 2014.03.25一个想找一件最有意义的事来做的下午

是时候该写这篇文章了,我意识到大一的大多数记忆已经开始模糊了, 剩下的一些是应该用文字记下的东西。

电脑高手

年少不去江湖老,放歌四海任逍遥。

未解前路多少事,欲与青天试比高!

一个十九岁的少年拉着行李箱来到了一个全新的城市,他想起了李逍遥当初也是这样 离开余杭小镇的,从此闯荡江湖。 不同的是李逍遥身边有个赵灵儿, 而我的身边只有个行李箱。 我想我已经进入人生的第二个阶段。 没有家人在身边,我会活的更自在,更独立。几年后,我会想李逍遥一般, 成为电脑高手。 还记的那年入学报到, 还记得那年军训, 还记的那个让我震惊的背影(不要写人,还是写技术吧)。

进入大学,本以为会遇见很多很多的电脑高手,但最后我失望了。 在开学不久, 我们学院的计算机科学学会开了一次迎接新生的会, 会上一个师兄讲了他参加ACM的经历, 特别是他的PPT,是我喜欢的风格。 这让我想起了我高中时参加NOIP的情景,我决定,大学我也要去参加ACM, 可以川师没这个环境,我也没这个能力去创造这个环境,最后便不了了之。 对当时的我来说,了解计算机的结构远远比算法来的更有趣。

十一过后, 我便把我那台历史悠久的台式机主机搬到了学校,然后买了一个液晶屏 连接上,从此就开始了学习技术。 当时我受到一个搞计算机的表叔的影响, 就给自己定下一个38计划,一天8小时睡觉,8小时看书, 8小时打电脑(当然没有做到)。在开始的一段时间, 我玩电脑的时候会开一个游戏挂机,那是我初中玩的一个游戏《快乐西游》。 后来这个游戏停止运营了,我又去玩了玩了《传奇》,觉得实在无聊, 以后就没有怎么玩游戏了(后来在毕业的时候,才发现,想玩的游戏没有玩, 想追的女生也没有追,一直引为平生遗憾)。这样,在玩电脑时, 我就把全部的精力都放在了学习编程上。 我当时的目标很明确, 在大学我只学三样东西:数学,计算机,英语。 所以,除了与这些相关的课程, 我就逃了,期末也果然被挂了。 这是我应得的, 我欣然接受。

Java

上大学我学的第一门语言是Java, 记得当时Sun还在。 Sun是一家非常理想, 值得让每一个做技术的人尊敬的公司。 由于以前有编程的基础, 我便直接去sun的官方,把关于java的文档(全英文)下载下来看, 一个是tutorial, 一个是doc。整个大一上学期,我几乎就是在看tutorial这个文档。 起初的时候,英文不是很好,需要一边查字典,一边看,有时遇到复杂的句子, 还有分析句子成分,一天最多能看三四页。tutorial的文字是学得很好的, 看了差不多一个月后,发现常用的单词就那些个,几乎就不用字典了, 一天看一节没什么困难。 以至于后来考四六级的时候都是裸考,运气好一点就过了。 大约把tutorial看了1/3左右,进度便开始慢了下来,我便去图书馆借了一本关于 java的书来看,这本书是《Object Oriented Software Development in Java》。 这本书写的太好了,上面写道:面向对象技术的三个里程碑是Java,设计模式,UML。 这本书是这三者的完美结合, 我受益无穷,我觉得我那时才开始渐渐明白什么是 面向对象,尽管以前常常在胡思乱想面向对象的优点。

在大一上学期结束的时候,我加入了学校的计算机学会,在这里,我认识很多有个性, 有魅力的人,丰富了我的大学生活。在这里,我们一起考试前复习,一起抬展板, 一起办计算机技能大赛,一起写程序,一起喝酒,一起玩杀人游戏。。。 每次提起计协, 这些便历历在目。我在协会的位置是对窗的右边的第二个位置, 左边是一个如花一般 的学Java的师姐, 右边是一台服务器。我就在这个位置上默默学习着技术, 寻找着那一种我想要的感觉:沉迷。

计协每年都会办一届计算机技能大赛,比赛里有一项比敲键盘的速度,真有趣。 我和一个兄弟xiaov一起合作写了一个键盘比赛软件,当时我还没学数据库, 所以我写的用户端,xiaov写的数据库端,我们通过socket通信,这是我们的 第一次合作。感觉棒极了,这个经历给了我强大的信心。后来xiaov开始做android应用, 他应该好像是我们学校第一个做android的人,他是一个能跟上浪潮的程序员,我觉得。 我和他又合作了一次,写了一个android游戏,感觉依然很棒,和他一起写程序, 就没有写不出来的程序。在这这两次合作之间,我一个人写过项目,都挺失败的, 感觉很不爽。合作开发有趣多了,我想这也是想在开源社区蓬勃发展的原因。

大约大二上学期我感觉JavaSE学的差不多了,开始进军JavaEE,当时的版本6已经问世了。 我比较相信官方,所以最开始就去看JavaEE 6 Tutorial,里面好多新概念,斗都看大了。 里面很多的特性都要依赖appliation server. 这条路实在难走,我转向了SSH (Spring, Struts, Hibernate)。 学了Spring, 我才真正知道了什么是面向接口编程; 写了struts2,我第一次学着去看源代码。后来我还看了一个文档,J2EE Blueprint, 这是一个很好的文档, 我看了它关于web的讲解,我才明白servlet原来是这样用的。 以前写网站,我一直是一个jsp对应一个sevlet,还洋洋得意:自己做到了逻辑与表示层 的分离。哎,见识少了。至此,我便很少关注java了。 还有一件事,或多或少的很java 有点关系。在大二的下学期, 一个计协的兄弟介绍我去一家flash公司做兼职, 我答应去了。当时,我一点也不会as3,我当时只用3天,就可以开始着手做公司给的 小项目了。 我觉得我能在这么快的上手,是建立在我学习java的经历上的。 在公司兼职的期间,我有两个收获,一是我向自己证明了我完全有了独立的能力; 二是我有点累,我被剥削了,我想休息,去静静的想一想什么是才是我所追求的技术。

从各个方面来看,Java是值得我去铭记的。

Linux

大一上学期的计算机导论这门课是我另一个故事的开端(或者说是一个)。 我记得,有一次, 这门课的作业是问我们想做一个什么软件, 我记得当时的回答是要做一个面向对象的操作系统。其实在高中的时候, 我就对操作系统特别感兴趣,当时我买了一本很贵的关于操作系统(我妈给我买的) 的书来看,可惜看不懂。

真正意义上,我用的第一个gnu/linux操作系统是ubuntu发行版,一个学java的师兄 介绍给我的。以前总是在网上看到,说真正的黑客都用linux,为此,高中时, 我还买了一套redhat9.0的光盘来玩,可是没有能把它安装在电脑上。 而ubuntu的安装简直太简单了,而且安装时间很快。 我慢慢的从windows转移到了 ubuntu上来操作。我了解到了opensource,我了解linux的发展,我了解到了gnu, 我了解到了apache,好多好多新鲜的东西。这个大一的下学期,我都在ubuntu上玩, 我在上面写java代码,在上面学习bash, linux用户空间编程。我慢慢的尝到了 linux的甜头,我开始对microsoft的东西不屑一顾。

随着对技术的渐渐了解,我对编游戏不那么狂热,对java的好奇心也没那么强烈了, 我决定开始着手我的下一个目标,写一个操作系统。说做就做,在大一的暑假, 我去书店买了一本书《自己动手写操作系统》,照着上面的代码写。 还记得开始的例子都是汇编的,用的nasm汇编器。最开始照着书上的步骤写了个启动扇区, 这是我写的第一个能在裸机上运行的程序,当我看见那行hello,world的时候, 我兴奋不已。

接着我跟着这本书学习了intel的安全模式,这是TMD的什么东西,差点让当时的我 走火入魔。我硬着头皮照着书上的代码敲这代码,虽然很多代码我都不认识。 程序依然正常,但已经失控了。我继续着下一章,继续照着书上的代码敲着, 我可以不懂,我只是想看看屏幕上结果,没有亲自敲下每个代码,我始终不放心。 可是,这一次程序没有按照书上的执行,我望着满屏的汇编代码,有种无从下手的感觉。

我决定从基础学起。我一直相信一句话,对于天才来说,基础决定了你与其他天才的差距。 于是我学习汇编,学习操作系统原理。学习这些后,发现自己依然不能写出一个操作系统。 要写一个操作系统还要学习与计算机硬件相关的知识, 于是我有学习计算机组成原理, 看intel 386的文档。但是我还是感觉我不能写出一个操作系统,我是典型的中国人, 没创造力,于是我想去山寨linux。后来,我学习了linux的内核, 学习gnu/linux系统是怎么启动起来的(强烈建议去看看lfs,linux from scrach)。 但还是山寨失败,我又去重新学数字电路(以前上课学过)。我突然发现, 要成为一个真正的技术人员,我还差远了。当我把这些基础课程了解的差不多的那天, 已经是大三下学期了。其实整个大三的一年,我学习技术的节奏明显变慢了, 我看了很多杂七杂八的书,想了很多杂七杂八的事情。原来编程是需要平台的, 就像《几何原本》一样, 证明是需要公理作为基础的,所谓的各种应用开发和内核开发 只不过是大家站的平台不一样罢了。技术不仅仅是编程。还有好多好的感受。 是不是无聊之人的感受特别多?

不想写了

大四是实习的阶段。由于我被保研,大四的节奏依然像大三一样,我很悠闲的看着我想看 或没看完的各种书。说实话,我去过三家小公司,没有做过一个真正意义上的项目, 不过接触了很多各种各样的应用,比如GIS,ASP.NET,PHP,网络数据包截获,等等。 这就是我对我大四实习的总结。最后的毕业设计,我做的是一个8086的反汇编器,很简单。 说来惭愧,我的毕业设计文档是翻译intel的8086官方文档写出来的,这让我节约了 很多时间来做其他的事情。本科就这样结束了。我还要在这里呆三年,天啊!

大四是一个总结的阶段。回首这三年的程序生涯,我积累了很多的经验。在最后一年里, 我看了两本书:《Structure and Interpretation of Program》和 《The unix programming environment》。这两本书把那些经验都消化了, 变成了哲学。 有些东西,越是清晰,越是在乎,越不知道该以什么结构来表达。 还是不写了, 反正字数也够了。

基于实时迭代的数值鲁棒NMPC双模稳定预测模型(Matlab代码实现)内容概要:本文介绍了基于实时迭代的数值鲁棒非线性模型预测控制(NMPC)双模稳定预测模型的研究与Matlab代码实现,重点在于通过数值方法提升NMPC在动态系统中的鲁棒性与稳定性。文中结合实时迭代机制,构建了能够应对系统不确定性与外部扰动的双模预测控制框架,并利用Matlab进行仿真验证,展示了该模型在复杂非线性系统控制中的有效性与实用性。同时,文档列举了大量相关的科研方向与技术应用案例,涵盖优化调度、路径规划、电力系统管理、信号处理等多个领域,体现了该方法的广泛适用性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事自动化、电气工程、智能制造等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于解决非线性动态系统的实时控制问题,如机器人控制、无人机路径跟踪、微电网能量管理等;②帮助科研人员复现论文算法,开展NMPC相关创新研究;③为复杂系统提供高精度、强鲁棒性的预测控制解决方案。; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,重点关注NMPC的实时迭代机制与双模稳定设计原理,并参考文档中列出的相关案例拓展应用场景,同时可借助网盘资源获取完整代码与数据支持。
UWB-IMU、UWB定位对比研究(Matlab代码实现)内容概要:本文介绍了名为《UWB-IMU、UWB定位对比研究(Matlab代码实现)》的技术文档,重点围绕超宽带(UWB)与惯性测量单元(IMU)融合定位技术展开,通过Matlab代码实现对两种定位方式的性能进行对比分析。文中详细阐述了UWB单独定位与UWB-IMU融合定位的原理、算法设计及仿真实现过程,利用多传感器数据融合策略提升定位精度与稳定性,尤其在复杂环境中减少信号遮挡和漂移误差的影响。研究内容包括系统建模、数据预处理、滤波算法(如扩展卡尔曼滤波EKF)的应用以及定位结果的可视化与误差分析。; 适合人群:具备一定信号处理、导航定位或传感器融合基础知识的研究生、科研人员及从事物联网、无人驾驶、机器人等领域的工程技术人员。; 使用场景及目标:①用于高精度室内定位系统的设计与优化,如智能仓储、无人机导航、工业巡检等;②帮助理解多源传感器融合的基本原理与实现方法,掌握UWB与IMU互补优势的技术路径;③为相关科研项目或毕业设计提供可复现的Matlab代码参考与实验验证平台。; 阅读建议:建议读者结合Matlab代码逐段理解算法实现细节,重点关注数据融合策略与滤波算法部分,同时可通过修改参数或引入实际采集数据进行扩展实验,以加深对定位系统性能影响因素的理解。
本系统基于MATLAB平台开发,适用于2014a、2019b及2024b等多个软件版本,并提供了可直接执行的示例数据集。代码采用模块化设计,关键参数均可灵活调整,程序结构逻辑分明且附有详细说明注释。主要面向计算机科学、电子信息工程、数学等相关专业的高校学生,适用于课程实验、综合作业及学位论文等教学与科研场景。 水声通信是一种借助水下声波实现信息传输的技术。近年来,多输入多输出(MIMO)结构与正交频分复用(OFDM)机制被逐步整合到水声通信体系中,显著增强了水下信息传输的容量与稳健性。MIMO配置通过多天线收发实现空间维度上的信号复用,从而提升频谱使用效率;OFDM方案则能够有效克服水下信道中的频率选择性衰减问题,保障信号在复杂传播环境中的可靠送达。 本系统以MATLAB为仿真环境,该工具在工程计算、信号分析与通信模拟等领域具备广泛的应用基础。用户可根据自身安装的MATLAB版本选择相应程序文件。随附的案例数据便于快速验证系统功能与性能表现。代码设计注重可读性与可修改性,采用参数驱动方式,重要变量均设有明确注释,便于理解与后续调整。因此,该系统特别适合高等院校相关专业学生用于课程实践、专题研究或毕业设计等学术训练环节。 借助该仿真平台,学习者可深入探究水声通信的基础理论及其关键技术,具体掌握MIMO与OFDM技术在水声环境中的协同工作机制。同时,系统具备良好的交互界面与可扩展架构,用户可在现有框架基础上进行功能拓展或算法改进,以适应更复杂的科研课题或工程应用需求。整体而言,该系统为一套功能完整、操作友好、适应面广的水声通信教学与科研辅助工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
数据结构部分 -- 一、栈和队列 Stack && Queue 栈 - 结构图 alt 队列 - 结构图 alt 双端队列 - 结构图 alt 二、 链表 Linked List 单链表 - 结构图 alt 单项循环链表 - 结构图 alt 双向链表 - 结构图 alt 三、 树 基础定义及相关性质内容 - 结构图 alt - 另外可以参考浙江大学数据结构课程中关于遍历方式的图,讲的十分详细 alt 使用链表实现二叉树 二叉查找树 - 非空左子树的所有键值小于根节点的键值 - 非空右子树的所有键值大于根节点的键值 - 左右子树都是二叉查找树 补充 - 完全二叉树 - 如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。 - 满二叉树 - 如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。 代码下载地址: https://pan.quark.cn/s/b48377ea3e78 四、 堆 Heap 堆满足的条件 - 必须是完全二叉树 - 各个父节点必须大于或者小于左右节点,其中最顶层的根结点必须是最大或者最小的 实现方式及条件 - 使用数组实现二叉堆,例如下图的最大堆,在数组中使用[0,100,90,85,80,30,60,50,55]存储,注意上述第一个元素0仅仅是做占位; - 设节点位置为x,则左节点位置为2x,右节点在2x+1;已知叶子节点x,根节点为x//2; - 举例说明: - 100为根节点(位置为1),则左节点位置为2,即90,右节点位置为3,即85; - 30为子节点(位置为5),则根节点为(5//2=2),即90; 根据上述条件,我们可以绘制出堆的两种形式 - 最大堆及实现 al...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值